// Generated by the protocol buffer compiler.  DO NOT EDIT!
// NO CHECKED-IN PROTOBUF GENCODE
// source: google/protobuf/type.proto
// Protobuf C++ Version: 5.28.0-dev

#include "google/protobuf/type.pb.h"

#include <algorithm>
#include <type_traits>
#include "google/protobuf/io/coded_stream.h"
#include "google/protobuf/generated_message_tctable_impl.h"
#include "google/protobuf/extension_set.h"
#include "google/protobuf/wire_format_lite.h"
#include "google/protobuf/descriptor.h"
#include "google/protobuf/generated_message_reflection.h"
#include "google/protobuf/reflection_ops.h"
#include "google/protobuf/wire_format.h"
// @@protoc_insertion_point(includes)

// Must be included last.
#include "google/protobuf/port_def.inc"
PROTOBUF_PRAGMA_INIT_SEG
namespace _pb = ::google::protobuf;
namespace _pbi = ::google::protobuf::internal;
namespace _fl = ::google::protobuf::internal::field_layout;
namespace google {
namespace protobuf {

inline constexpr Option::Impl_::Impl_(
    ::_pbi::ConstantInitialized) noexcept
      : _cached_size_{0},
        name_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        value_{nullptr} {}

template <typename>
PROTOBUF_CONSTEXPR Option::Option(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(::_pbi::ConstantInitialized()) {
}
struct OptionDefaultTypeInternal {
  PROTOBUF_CONSTEXPR OptionDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
  ~OptionDefaultTypeInternal() {}
  union {
    Option _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 OptionDefaultTypeInternal _Option_default_instance_;

inline constexpr Field::Impl_::Impl_(
    ::_pbi::ConstantInitialized) noexcept
      : options_{},
        name_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        type_url_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        json_name_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        default_value_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        kind_{static_cast< ::google::protobuf::Field_Kind >(0)},
        cardinality_{static_cast< ::google::protobuf::Field_Cardinality >(0)},
        number_{0},
        oneof_index_{0},
        packed_{false},
        _cached_size_{0} {}

template <typename>
PROTOBUF_CONSTEXPR Field::Field(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(::_pbi::ConstantInitialized()) {
}
struct FieldDefaultTypeInternal {
  PROTOBUF_CONSTEXPR FieldDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
  ~FieldDefaultTypeInternal() {}
  union {
    Field _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 FieldDefaultTypeInternal _Field_default_instance_;

inline constexpr EnumValue::Impl_::Impl_(
    ::_pbi::ConstantInitialized) noexcept
      : options_{},
        name_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        number_{0},
        _cached_size_{0} {}

template <typename>
PROTOBUF_CONSTEXPR EnumValue::EnumValue(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(::_pbi::ConstantInitialized()) {
}
struct EnumValueDefaultTypeInternal {
  PROTOBUF_CONSTEXPR EnumValueDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
  ~EnumValueDefaultTypeInternal() {}
  union {
    EnumValue _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 EnumValueDefaultTypeInternal _EnumValue_default_instance_;

inline constexpr Type::Impl_::Impl_(
    ::_pbi::ConstantInitialized) noexcept
      : _cached_size_{0},
        fields_{},
        oneofs_{},
        options_{},
        name_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        edition_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        source_context_{nullptr},
        syntax_{static_cast< ::google::protobuf::Syntax >(0)} {}

template <typename>
PROTOBUF_CONSTEXPR Type::Type(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(::_pbi::ConstantInitialized()) {
}
struct TypeDefaultTypeInternal {
  PROTOBUF_CONSTEXPR TypeDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
  ~TypeDefaultTypeInternal() {}
  union {
    Type _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 TypeDefaultTypeInternal _Type_default_instance_;

inline constexpr Enum::Impl_::Impl_(
    ::_pbi::ConstantInitialized) noexcept
      : _cached_size_{0},
        enumvalue_{},
        options_{},
        name_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        edition_(
            &::google::protobuf::internal::fixed_address_empty_string,
            ::_pbi::ConstantInitialized()),
        source_context_{nullptr},
        syntax_{static_cast< ::google::protobuf::Syntax >(0)} {}

template <typename>
PROTOBUF_CONSTEXPR Enum::Enum(::_pbi::ConstantInitialized)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(_class_data_.base()),
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(),
#endif  // PROTOBUF_CUSTOM_VTABLE
      _impl_(::_pbi::ConstantInitialized()) {
}
struct EnumDefaultTypeInternal {
  PROTOBUF_CONSTEXPR EnumDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
  ~EnumDefaultTypeInternal() {}
  union {
    Enum _instance;
  };
};

PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_EXPORT
    PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 EnumDefaultTypeInternal _Enum_default_instance_;
}  // namespace protobuf
}  // namespace google
static const ::_pb::EnumDescriptor* file_level_enum_descriptors_google_2fprotobuf_2ftype_2eproto[3];
static constexpr const ::_pb::ServiceDescriptor**
    file_level_service_descriptors_google_2fprotobuf_2ftype_2eproto = nullptr;
const ::uint32_t
    TableStruct_google_2fprotobuf_2ftype_2eproto::offsets[] ABSL_ATTRIBUTE_SECTION_VARIABLE(
        protodesc_cold) = {
        PROTOBUF_FIELD_OFFSET(::google::protobuf::Type, _impl_._has_bits_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::Type, _internal_metadata_),
        ~0u,  // no _extensions_
        ~0u,  // no _oneof_case_
        ~0u,  // no _weak_field_map_
        ~0u,  // no _inlined_string_donated_
        ~0u,  // no _split_
        ~0u,  // no sizeof(Split)
        PROTOBUF_FIELD_OFFSET(::google::protobuf::Type, _impl_.name_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::Type, _impl_.fields_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::Type, _impl_.oneofs_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::Type, _impl_.options_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::Type, _impl_.source_context_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::Type, _impl_.syntax_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::Type, _impl_.edition_),
        ~0u,
        ~0u,
        ~0u,
        ~0u,
        0,
        ~0u,
        ~0u,
        ~0u,  // no _has_bits_
        PROTOBUF_FIELD_OFFSET(::google::protobuf::Field, _internal_metadata_),
        ~0u,  // no _extensions_
        ~0u,  // no _oneof_case_
        ~0u,  // no _weak_field_map_
        ~0u,  // no _inlined_string_donated_
        ~0u,  // no _split_
        ~0u,  // no sizeof(Split)
        PROTOBUF_FIELD_OFFSET(::google::protobuf::Field, _impl_.kind_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::Field, _impl_.cardinality_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::Field, _impl_.number_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::Field, _impl_.name_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::Field, _impl_.type_url_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::Field, _impl_.oneof_index_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::Field, _impl_.packed_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::Field, _impl_.options_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::Field, _impl_.json_name_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::Field, _impl_.default_value_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::Enum, _impl_._has_bits_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::Enum, _internal_metadata_),
        ~0u,  // no _extensions_
        ~0u,  // no _oneof_case_
        ~0u,  // no _weak_field_map_
        ~0u,  // no _inlined_string_donated_
        ~0u,  // no _split_
        ~0u,  // no sizeof(Split)
        PROTOBUF_FIELD_OFFSET(::google::protobuf::Enum, _impl_.name_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::Enum, _impl_.enumvalue_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::Enum, _impl_.options_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::Enum, _impl_.source_context_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::Enum, _impl_.syntax_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::Enum, _impl_.edition_),
        ~0u,
        ~0u,
        ~0u,
        0,
        ~0u,
        ~0u,
        ~0u,  // no _has_bits_
        PROTOBUF_FIELD_OFFSET(::google::protobuf::EnumValue, _internal_metadata_),
        ~0u,  // no _extensions_
        ~0u,  // no _oneof_case_
        ~0u,  // no _weak_field_map_
        ~0u,  // no _inlined_string_donated_
        ~0u,  // no _split_
        ~0u,  // no sizeof(Split)
        PROTOBUF_FIELD_OFFSET(::google::protobuf::EnumValue, _impl_.name_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::EnumValue, _impl_.number_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::EnumValue, _impl_.options_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::Option, _impl_._has_bits_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::Option, _internal_metadata_),
        ~0u,  // no _extensions_
        ~0u,  // no _oneof_case_
        ~0u,  // no _weak_field_map_
        ~0u,  // no _inlined_string_donated_
        ~0u,  // no _split_
        ~0u,  // no sizeof(Split)
        PROTOBUF_FIELD_OFFSET(::google::protobuf::Option, _impl_.name_),
        PROTOBUF_FIELD_OFFSET(::google::protobuf::Option, _impl_.value_),
        ~0u,
        0,
};

static const ::_pbi::MigrationSchema
    schemas[] ABSL_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {
        {0, 15, -1, sizeof(::google::protobuf::Type)},
        {22, -1, -1, sizeof(::google::protobuf::Field)},
        {40, 54, -1, sizeof(::google::protobuf::Enum)},
        {60, -1, -1, sizeof(::google::protobuf::EnumValue)},
        {71, 81, -1, sizeof(::google::protobuf::Option)},
};
static const ::_pb::Message* const file_default_instances[] = {
    &::google::protobuf::_Type_default_instance_._instance,
    &::google::protobuf::_Field_default_instance_._instance,
    &::google::protobuf::_Enum_default_instance_._instance,
    &::google::protobuf::_EnumValue_default_instance_._instance,
    &::google::protobuf::_Option_default_instance_._instance,
};
const char descriptor_table_protodef_google_2fprotobuf_2ftype_2eproto[] ABSL_ATTRIBUTE_SECTION_VARIABLE(
    protodesc_cold) = {
    "\n\032google/protobuf/type.proto\022\017google.pro"
    "tobuf\032\031google/protobuf/any.proto\032$google"
    "/protobuf/source_context.proto\"\350\001\n\004Type\022"
    "\014\n\004name\030\001 \001(\t\022&\n\006fields\030\002 \003(\0132\026.google.p"
    "rotobuf.Field\022\016\n\006oneofs\030\003 \003(\t\022(\n\007options"
    "\030\004 \003(\0132\027.google.protobuf.Option\0226\n\016sourc"
    "e_context\030\005 \001(\0132\036.google.protobuf.Source"
    "Context\022\'\n\006syntax\030\006 \001(\0162\027.google.protobu"
    "f.Syntax\022\017\n\007edition\030\007 \001(\t\"\325\005\n\005Field\022)\n\004k"
    "ind\030\001 \001(\0162\033.google.protobuf.Field.Kind\0227"
    "\n\013cardinality\030\002 \001(\0162\".google.protobuf.Fi"
    "eld.Cardinality\022\016\n\006number\030\003 \001(\005\022\014\n\004name\030"
    "\004 \001(\t\022\020\n\010type_url\030\006 \001(\t\022\023\n\013oneof_index\030\007"
    " \001(\005\022\016\n\006packed\030\010 \001(\010\022(\n\007options\030\t \003(\0132\027."
    "google.protobuf.Option\022\021\n\tjson_name\030\n \001("
    "\t\022\025\n\rdefault_value\030\013 \001(\t\"\310\002\n\004Kind\022\020\n\014TYP"
    "E_UNKNOWN\020\000\022\017\n\013TYPE_DOUBLE\020\001\022\016\n\nTYPE_FLO"
    "AT\020\002\022\016\n\nTYPE_INT64\020\003\022\017\n\013TYPE_UINT64\020\004\022\016\n"
    "\nTYPE_INT32\020\005\022\020\n\014TYPE_FIXED64\020\006\022\020\n\014TYPE_"
    "FIXED32\020\007\022\r\n\tTYPE_BOOL\020\010\022\017\n\013TYPE_STRING\020"
    "\t\022\016\n\nTYPE_GROUP\020\n\022\020\n\014TYPE_MESSAGE\020\013\022\016\n\nT"
    "YPE_BYTES\020\014\022\017\n\013TYPE_UINT32\020\r\022\r\n\tTYPE_ENU"
    "M\020\016\022\021\n\rTYPE_SFIXED32\020\017\022\021\n\rTYPE_SFIXED64\020"
    "\020\022\017\n\013TYPE_SINT32\020\021\022\017\n\013TYPE_SINT64\020\022\"t\n\013C"
    "ardinality\022\027\n\023CARDINALITY_UNKNOWN\020\000\022\030\n\024C"
    "ARDINALITY_OPTIONAL\020\001\022\030\n\024CARDINALITY_REQ"
    "UIRED\020\002\022\030\n\024CARDINALITY_REPEATED\020\003\"\337\001\n\004En"
    "um\022\014\n\004name\030\001 \001(\t\022-\n\tenumvalue\030\002 \003(\0132\032.go"
    "ogle.protobuf.EnumValue\022(\n\007options\030\003 \003(\013"
    "2\027.google.protobuf.Option\0226\n\016source_cont"
    "ext\030\004 \001(\0132\036.google.protobuf.SourceContex"
    "t\022\'\n\006syntax\030\005 \001(\0162\027.google.protobuf.Synt"
    "ax\022\017\n\007edition\030\006 \001(\t\"S\n\tEnumValue\022\014\n\004name"
    "\030\001 \001(\t\022\016\n\006number\030\002 \001(\005\022(\n\007options\030\003 \003(\0132"
    "\027.google.protobuf.Option\";\n\006Option\022\014\n\004na"
    "me\030\001 \001(\t\022#\n\005value\030\002 \001(\0132\024.google.protobu"
    "f.Any*C\n\006Syntax\022\021\n\rSYNTAX_PROTO2\020\000\022\021\n\rSY"
    "NTAX_PROTO3\020\001\022\023\n\017SYNTAX_EDITIONS\020\002B{\n\023co"
    "m.google.protobufB\tTypeProtoP\001Z-google.g"
    "olang.org/protobuf/types/known/typepb\370\001\001"
    "\242\002\003GPB\252\002\036Google.Protobuf.WellKnownTypesb"
    "\006proto3"
};
static const ::_pbi::DescriptorTable* const descriptor_table_google_2fprotobuf_2ftype_2eproto_deps[2] =
    {
        &::descriptor_table_google_2fprotobuf_2fany_2eproto,
        &::descriptor_table_google_2fprotobuf_2fsource_5fcontext_2eproto,
};
static ::absl::once_flag descriptor_table_google_2fprotobuf_2ftype_2eproto_once;
PROTOBUF_CONSTINIT const ::_pbi::DescriptorTable descriptor_table_google_2fprotobuf_2ftype_2eproto = {
    false,
    false,
    1647,
    descriptor_table_protodef_google_2fprotobuf_2ftype_2eproto,
    "google/protobuf/type.proto",
    &descriptor_table_google_2fprotobuf_2ftype_2eproto_once,
    descriptor_table_google_2fprotobuf_2ftype_2eproto_deps,
    2,
    5,
    schemas,
    file_default_instances,
    TableStruct_google_2fprotobuf_2ftype_2eproto::offsets,
    file_level_enum_descriptors_google_2fprotobuf_2ftype_2eproto,
    file_level_service_descriptors_google_2fprotobuf_2ftype_2eproto,
};
namespace google {
namespace protobuf {
const ::google::protobuf::EnumDescriptor* Field_Kind_descriptor() {
  ::google::protobuf::internal::AssignDescriptors(&descriptor_table_google_2fprotobuf_2ftype_2eproto);
  return file_level_enum_descriptors_google_2fprotobuf_2ftype_2eproto[0];
}
PROTOBUF_CONSTINIT const uint32_t Field_Kind_internal_data_[] = {
    1245184u, 0u, };
bool Field_Kind_IsValid(int value) {
  return 0 <= value && value <= 18;
}
#if (__cplusplus < 201703) && \
  (!defined(_MSC_VER) || (_MSC_VER >= 1900 && _MSC_VER < 1912))

constexpr Field_Kind Field::TYPE_UNKNOWN;
constexpr Field_Kind Field::TYPE_DOUBLE;
constexpr Field_Kind Field::TYPE_FLOAT;
constexpr Field_Kind Field::TYPE_INT64;
constexpr Field_Kind Field::TYPE_UINT64;
constexpr Field_Kind Field::TYPE_INT32;
constexpr Field_Kind Field::TYPE_FIXED64;
constexpr Field_Kind Field::TYPE_FIXED32;
constexpr Field_Kind Field::TYPE_BOOL;
constexpr Field_Kind Field::TYPE_STRING;
constexpr Field_Kind Field::TYPE_GROUP;
constexpr Field_Kind Field::TYPE_MESSAGE;
constexpr Field_Kind Field::TYPE_BYTES;
constexpr Field_Kind Field::TYPE_UINT32;
constexpr Field_Kind Field::TYPE_ENUM;
constexpr Field_Kind Field::TYPE_SFIXED32;
constexpr Field_Kind Field::TYPE_SFIXED64;
constexpr Field_Kind Field::TYPE_SINT32;
constexpr Field_Kind Field::TYPE_SINT64;
constexpr Field_Kind Field::Kind_MIN;
constexpr Field_Kind Field::Kind_MAX;
constexpr int Field::Kind_ARRAYSIZE;

#endif  // (__cplusplus < 201703) &&
        // (!defined(_MSC_VER) || (_MSC_VER >= 1900 && _MSC_VER < 1912))
const ::google::protobuf::EnumDescriptor* Field_Cardinality_descriptor() {
  ::google::protobuf::internal::AssignDescriptors(&descriptor_table_google_2fprotobuf_2ftype_2eproto);
  return file_level_enum_descriptors_google_2fprotobuf_2ftype_2eproto[1];
}
PROTOBUF_CONSTINIT const uint32_t Field_Cardinality_internal_data_[] = {
    262144u, 0u, };
bool Field_Cardinality_IsValid(int value) {
  return 0 <= value && value <= 3;
}
#if (__cplusplus < 201703) && \
  (!defined(_MSC_VER) || (_MSC_VER >= 1900 && _MSC_VER < 1912))

constexpr Field_Cardinality Field::CARDINALITY_UNKNOWN;
constexpr Field_Cardinality Field::CARDINALITY_OPTIONAL;
constexpr Field_Cardinality Field::CARDINALITY_REQUIRED;
constexpr Field_Cardinality Field::CARDINALITY_REPEATED;
constexpr Field_Cardinality Field::Cardinality_MIN;
constexpr Field_Cardinality Field::Cardinality_MAX;
constexpr int Field::Cardinality_ARRAYSIZE;

#endif  // (__cplusplus < 201703) &&
        // (!defined(_MSC_VER) || (_MSC_VER >= 1900 && _MSC_VER < 1912))
const ::google::protobuf::EnumDescriptor* Syntax_descriptor() {
  ::google::protobuf::internal::AssignDescriptors(&descriptor_table_google_2fprotobuf_2ftype_2eproto);
  return file_level_enum_descriptors_google_2fprotobuf_2ftype_2eproto[2];
}
PROTOBUF_CONSTINIT const uint32_t Syntax_internal_data_[] = {
    196608u, 0u, };
bool Syntax_IsValid(int value) {
  return 0 <= value && value <= 2;
}
// ===================================================================

class Type::_Internal {
 public:
  using HasBits =
      decltype(std::declval<Type>()._impl_._has_bits_);
  static constexpr ::int32_t kHasBitsOffset =
      8 * PROTOBUF_FIELD_OFFSET(Type, _impl_._has_bits_);
};

void Type::clear_source_context() {
  ::google::protobuf::internal::TSanWrite(&_impl_);
  if (_impl_.source_context_ != nullptr) _impl_.source_context_->Clear();
  _impl_._has_bits_[0] &= ~0x00000001u;
}
Type::Type(::google::protobuf::Arena* arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, _class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SharedCtor(arena);
  // @@protoc_insertion_point(arena_constructor:google.protobuf.Type)
}
inline PROTOBUF_NDEBUG_INLINE Type::Impl_::Impl_(
    ::google::protobuf::internal::InternalVisibility visibility, ::google::protobuf::Arena* arena,
    const Impl_& from, const ::google::protobuf::Type& from_msg)
      : _has_bits_{from._has_bits_},
        _cached_size_{0},
        fields_{visibility, arena, from.fields_},
        oneofs_{visibility, arena, from.oneofs_},
        options_{visibility, arena, from.options_},
        name_(arena, from.name_),
        edition_(arena, from.edition_) {}

Type::Type(
    ::google::protobuf::Arena* arena,
    const Type& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, _class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  Type* const _this = this;
  (void)_this;
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
  new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from);
  ::uint32_t cached_has_bits = _impl_._has_bits_[0];
  _impl_.source_context_ = (cached_has_bits & 0x00000001u) ? ::google::protobuf::Message::CopyConstruct<::google::protobuf::SourceContext>(
                              arena, *from._impl_.source_context_)
                        : nullptr;
  _impl_.syntax_ = from._impl_.syntax_;

  // @@protoc_insertion_point(copy_constructor:google.protobuf.Type)
}
inline PROTOBUF_NDEBUG_INLINE Type::Impl_::Impl_(
    ::google::protobuf::internal::InternalVisibility visibility,
    ::google::protobuf::Arena* arena)
      : _cached_size_{0},
        fields_{visibility, arena},
        oneofs_{visibility, arena},
        options_{visibility, arena},
        name_(arena),
        edition_(arena) {}

inline void Type::SharedCtor(::_pb::Arena* arena) {
  new (&_impl_) Impl_(internal_visibility(), arena);
  ::memset(reinterpret_cast<char *>(&_impl_) +
               offsetof(Impl_, source_context_),
           0,
           offsetof(Impl_, syntax_) -
               offsetof(Impl_, source_context_) +
               sizeof(Impl_::syntax_));
}
Type::~Type() {
  // @@protoc_insertion_point(destructor:google.protobuf.Type)
  _internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
  SharedDtor();
}
inline void Type::SharedDtor() {
  ABSL_DCHECK(GetArena() == nullptr);
  _impl_.name_.Destroy();
  _impl_.edition_.Destroy();
  delete _impl_.source_context_;
  _impl_.~Impl_();
}

PROTOBUF_CONSTINIT
PROTOBUF_ATTRIBUTE_INIT_PRIORITY1
const ::google::protobuf::MessageLite::ClassDataFull
    Type::_class_data_ = {
        ::google::protobuf::Message::ClassData{
            &_table_.header,
            nullptr,  // OnDemandRegisterArenaDtor
            nullptr,  // IsInitialized
            &Type::MergeImpl,
#if defined(PROTOBUF_CUSTOM_VTABLE)
            ::google::protobuf::Message::GetDeleteImpl<Type>(),
            ::google::protobuf::Message::GetNewImpl<Type>(),
            ::google::protobuf::Message::GetClearImpl<Type>(),
                ::google::protobuf::Message::GetByteSizeLongImpl<Type>(),
                ::google::protobuf::Message::GetSerializeImpl<Type>(),
#endif  // PROTOBUF_CUSTOM_VTABLE
            PROTOBUF_FIELD_OFFSET(Type, _impl_._cached_size_),
            false,
        },
        &Type::kDescriptorMethods,
        &descriptor_table_google_2fprotobuf_2ftype_2eproto,
        nullptr,  // tracker
};
const ::google::protobuf::MessageLite::ClassData* Type::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(_class_data_.tc_table);
  return _class_data_.base();
}
PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1
const ::_pbi::TcParseTable<3, 7, 3, 46, 2> Type::_table_ = {
  {
    PROTOBUF_FIELD_OFFSET(Type, _impl_._has_bits_),
    0, // no _extensions_
    7, 56,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    4294967168,  // skipmap
    offsetof(decltype(_table_), field_entries),
    7,  // num_field_entries
    3,  // num_aux_entries
    offsetof(decltype(_table_), aux_entries),
    &_Type_default_instance_._instance,
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::Type>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    {::_pbi::TcParser::MiniParse, {}},
    // string name = 1;
    {::_pbi::TcParser::FastUS1,
     {10, 63, 0, PROTOBUF_FIELD_OFFSET(Type, _impl_.name_)}},
    // repeated .google.protobuf.Field fields = 2;
    {::_pbi::TcParser::FastMtR1,
     {18, 63, 0, PROTOBUF_FIELD_OFFSET(Type, _impl_.fields_)}},
    // repeated string oneofs = 3;
    {::_pbi::TcParser::FastUR1,
     {26, 63, 0, PROTOBUF_FIELD_OFFSET(Type, _impl_.oneofs_)}},
    // repeated .google.protobuf.Option options = 4;
    {::_pbi::TcParser::FastMtR1,
     {34, 63, 1, PROTOBUF_FIELD_OFFSET(Type, _impl_.options_)}},
    // .google.protobuf.SourceContext source_context = 5;
    {::_pbi::TcParser::FastMtS1,
     {42, 0, 2, PROTOBUF_FIELD_OFFSET(Type, _impl_.source_context_)}},
    // .google.protobuf.Syntax syntax = 6;
    {::_pbi::TcParser::SingularVarintNoZag1<::uint32_t, offsetof(Type, _impl_.syntax_), 63>(),
     {48, 63, 0, PROTOBUF_FIELD_OFFSET(Type, _impl_.syntax_)}},
    // string edition = 7;
    {::_pbi::TcParser::FastUS1,
     {58, 63, 0, PROTOBUF_FIELD_OFFSET(Type, _impl_.edition_)}},
  }}, {{
    65535, 65535
  }}, {{
    // string name = 1;
    {PROTOBUF_FIELD_OFFSET(Type, _impl_.name_), -1, 0,
    (0 | ::_fl::kFcSingular | ::_fl::kUtf8String | ::_fl::kRepAString)},
    // repeated .google.protobuf.Field fields = 2;
    {PROTOBUF_FIELD_OFFSET(Type, _impl_.fields_), -1, 0,
    (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)},
    // repeated string oneofs = 3;
    {PROTOBUF_FIELD_OFFSET(Type, _impl_.oneofs_), -1, 0,
    (0 | ::_fl::kFcRepeated | ::_fl::kUtf8String | ::_fl::kRepSString)},
    // repeated .google.protobuf.Option options = 4;
    {PROTOBUF_FIELD_OFFSET(Type, _impl_.options_), -1, 1,
    (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)},
    // .google.protobuf.SourceContext source_context = 5;
    {PROTOBUF_FIELD_OFFSET(Type, _impl_.source_context_), _Internal::kHasBitsOffset + 0, 2,
    (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)},
    // .google.protobuf.Syntax syntax = 6;
    {PROTOBUF_FIELD_OFFSET(Type, _impl_.syntax_), -1, 0,
    (0 | ::_fl::kFcSingular | ::_fl::kOpenEnum)},
    // string edition = 7;
    {PROTOBUF_FIELD_OFFSET(Type, _impl_.edition_), -1, 0,
    (0 | ::_fl::kFcSingular | ::_fl::kUtf8String | ::_fl::kRepAString)},
  }}, {{
    {::_pbi::TcParser::GetTable<::google::protobuf::Field>()},
    {::_pbi::TcParser::GetTable<::google::protobuf::Option>()},
    {::_pbi::TcParser::GetTable<::google::protobuf::SourceContext>()},
  }}, {{
    "\24\4\0\6\0\0\0\7"
    "google.protobuf.Type"
    "name"
    "oneofs"
    "edition"
  }},
};

PROTOBUF_NOINLINE void Type::Clear() {
// @@protoc_insertion_point(message_clear_start:google.protobuf.Type)
  ::google::protobuf::internal::TSanWrite(&_impl_);
  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void) cached_has_bits;

  _impl_.fields_.Clear();
  _impl_.oneofs_.Clear();
  _impl_.options_.Clear();
  _impl_.name_.ClearToEmpty();
  _impl_.edition_.ClearToEmpty();
  cached_has_bits = _impl_._has_bits_[0];
  if (cached_has_bits & 0x00000001u) {
    ABSL_DCHECK(_impl_.source_context_ != nullptr);
    _impl_.source_context_->Clear();
  }
  _impl_.syntax_ = 0;
  _impl_._has_bits_.Clear();
  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}

::uint8_t* Type::_InternalSerialize(
    ::uint8_t* target,
    ::google::protobuf::io::EpsCopyOutputStream* stream) const {
  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Type)
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  // string name = 1;
  if (!this->_internal_name().empty()) {
    const std::string& _s = this->_internal_name();
    ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
        _s.data(), static_cast<int>(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.protobuf.Type.name");
    target = stream->WriteStringMaybeAliased(1, _s, target);
  }

  // repeated .google.protobuf.Field fields = 2;
  for (unsigned i = 0, n = static_cast<unsigned>(
                           this->_internal_fields_size());
       i < n; i++) {
    const auto& repfield = this->_internal_fields().Get(i);
    target =
        ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
            2, repfield, repfield.GetCachedSize(),
            target, stream);
  }

  // repeated string oneofs = 3;
  for (int i = 0, n = this->_internal_oneofs_size(); i < n; ++i) {
    const auto& s = this->_internal_oneofs().Get(i);
    ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
        s.data(), static_cast<int>(s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.protobuf.Type.oneofs");
    target = stream->WriteString(3, s, target);
  }

  // repeated .google.protobuf.Option options = 4;
  for (unsigned i = 0, n = static_cast<unsigned>(
                           this->_internal_options_size());
       i < n; i++) {
    const auto& repfield = this->_internal_options().Get(i);
    target =
        ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
            4, repfield, repfield.GetCachedSize(),
            target, stream);
  }

  cached_has_bits = _impl_._has_bits_[0];
  // .google.protobuf.SourceContext source_context = 5;
  if (cached_has_bits & 0x00000001u) {
    target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
        5, *_impl_.source_context_, _impl_.source_context_->GetCachedSize(), target, stream);
  }

  // .google.protobuf.Syntax syntax = 6;
  if (this->_internal_syntax() != 0) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteEnumToArray(
        6, this->_internal_syntax(), target);
  }

  // string edition = 7;
  if (!this->_internal_edition().empty()) {
    const std::string& _s = this->_internal_edition();
    ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
        _s.data(), static_cast<int>(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.protobuf.Type.edition");
    target = stream->WriteStringMaybeAliased(7, _s, target);
  }

  if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) {
    target =
        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
            _internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
  }
  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.Type)
  return target;
}

::size_t Type::ByteSizeLong() const {
  // @@protoc_insertion_point(message_byte_size_start:google.protobuf.Type)
  ::size_t total_size = 0;

  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void)cached_has_bits;

  ::_pbi::Prefetch5LinesFrom7Lines(
      reinterpret_cast<const void*>(this));
   {
    // repeated .google.protobuf.Field fields = 2;
     {
      total_size += 1UL * this->_internal_fields_size();
      for (const auto& msg : this->_internal_fields()) {
        total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg);
      }
    }
    // repeated string oneofs = 3;
     {
      total_size += 1 * ::google::protobuf::internal::FromIntSize(_internal_oneofs().size());
      for (int i = 0, n = _internal_oneofs().size(); i < n; ++i) {
        total_size += ::google::protobuf::internal::WireFormatLite::StringSize(
            _internal_oneofs().Get(i));
      }
    }
    // repeated .google.protobuf.Option options = 4;
     {
      total_size += 1UL * this->_internal_options_size();
      for (const auto& msg : this->_internal_options()) {
        total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg);
      }
    }
  }
   {
    // string name = 1;
    if (!this->_internal_name().empty()) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this->_internal_name());
    }
    // string edition = 7;
    if (!this->_internal_edition().empty()) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this->_internal_edition());
    }
  }
   {
    // .google.protobuf.SourceContext source_context = 5;
    cached_has_bits = _impl_._has_bits_[0];
    if (cached_has_bits & 0x00000001u) {
      total_size +=
          1 + ::google::protobuf::internal::WireFormatLite::MessageSize(*_impl_.source_context_);
    }
  }
   {
    // .google.protobuf.Syntax syntax = 6;
    if (this->_internal_syntax() != 0) {
      total_size += 1 +
                    ::_pbi::WireFormatLite::EnumSize(this->_internal_syntax());
    }
  }
  return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_);
}

void Type::MergeImpl(::google::protobuf::MessageLite& to_msg, const ::google::protobuf::MessageLite& from_msg) {
  auto* const _this = static_cast<Type*>(&to_msg);
  auto& from = static_cast<const Type&>(from_msg);
  ::google::protobuf::Arena* arena = _this->GetArena();
  // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.Type)
  ABSL_DCHECK_NE(&from, _this);
  ::uint32_t cached_has_bits = 0;
  (void) cached_has_bits;

  _this->_internal_mutable_fields()->MergeFrom(
      from._internal_fields());
  _this->_internal_mutable_oneofs()->MergeFrom(from._internal_oneofs());
  _this->_internal_mutable_options()->MergeFrom(
      from._internal_options());
  if (!from._internal_name().empty()) {
    _this->_internal_set_name(from._internal_name());
  }
  if (!from._internal_edition().empty()) {
    _this->_internal_set_edition(from._internal_edition());
  }
  cached_has_bits = from._impl_._has_bits_[0];
  if (cached_has_bits & 0x00000001u) {
    ABSL_DCHECK(from._impl_.source_context_ != nullptr);
    if (_this->_impl_.source_context_ == nullptr) {
      _this->_impl_.source_context_ =
          ::google::protobuf::Message::CopyConstruct<::google::protobuf::SourceContext>(arena, *from._impl_.source_context_);
    } else {
      _this->_impl_.source_context_->MergeFrom(*from._impl_.source_context_);
    }
  }
  if (from._internal_syntax() != 0) {
    _this->_impl_.syntax_ = from._impl_.syntax_;
  }
  _this->_impl_._has_bits_[0] |= cached_has_bits;
  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(from._internal_metadata_);
}

void Type::CopyFrom(const Type& from) {
// @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.Type)
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}


void Type::InternalSwap(Type* PROTOBUF_RESTRICT other) {
  using std::swap;
  auto* arena = GetArena();
  ABSL_DCHECK_EQ(arena, other->GetArena());
  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
  swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]);
  _impl_.fields_.InternalSwap(&other->_impl_.fields_);
  _impl_.oneofs_.InternalSwap(&other->_impl_.oneofs_);
  _impl_.options_.InternalSwap(&other->_impl_.options_);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.name_, &other->_impl_.name_, arena);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.edition_, &other->_impl_.edition_, arena);
  ::google::protobuf::internal::memswap<
      PROTOBUF_FIELD_OFFSET(Type, _impl_.syntax_)
      + sizeof(Type::_impl_.syntax_)
      - PROTOBUF_FIELD_OFFSET(Type, _impl_.source_context_)>(
          reinterpret_cast<char*>(&_impl_.source_context_),
          reinterpret_cast<char*>(&other->_impl_.source_context_));
}

::google::protobuf::Metadata Type::GetMetadata() const {
  return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// ===================================================================

class Field::_Internal {
 public:
};

Field::Field(::google::protobuf::Arena* arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, _class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SharedCtor(arena);
  // @@protoc_insertion_point(arena_constructor:google.protobuf.Field)
}
inline PROTOBUF_NDEBUG_INLINE Field::Impl_::Impl_(
    ::google::protobuf::internal::InternalVisibility visibility, ::google::protobuf::Arena* arena,
    const Impl_& from, const ::google::protobuf::Field& from_msg)
      : options_{visibility, arena, from.options_},
        name_(arena, from.name_),
        type_url_(arena, from.type_url_),
        json_name_(arena, from.json_name_),
        default_value_(arena, from.default_value_),
        _cached_size_{0} {}

Field::Field(
    ::google::protobuf::Arena* arena,
    const Field& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, _class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  Field* const _this = this;
  (void)_this;
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
  new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from);
  ::memcpy(reinterpret_cast<char *>(&_impl_) +
               offsetof(Impl_, kind_),
           reinterpret_cast<const char *>(&from._impl_) +
               offsetof(Impl_, kind_),
           offsetof(Impl_, packed_) -
               offsetof(Impl_, kind_) +
               sizeof(Impl_::packed_));

  // @@protoc_insertion_point(copy_constructor:google.protobuf.Field)
}
inline PROTOBUF_NDEBUG_INLINE Field::Impl_::Impl_(
    ::google::protobuf::internal::InternalVisibility visibility,
    ::google::protobuf::Arena* arena)
      : options_{visibility, arena},
        name_(arena),
        type_url_(arena),
        json_name_(arena),
        default_value_(arena),
        _cached_size_{0} {}

inline void Field::SharedCtor(::_pb::Arena* arena) {
  new (&_impl_) Impl_(internal_visibility(), arena);
  ::memset(reinterpret_cast<char *>(&_impl_) +
               offsetof(Impl_, kind_),
           0,
           offsetof(Impl_, packed_) -
               offsetof(Impl_, kind_) +
               sizeof(Impl_::packed_));
}
Field::~Field() {
  // @@protoc_insertion_point(destructor:google.protobuf.Field)
  _internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
  SharedDtor();
}
inline void Field::SharedDtor() {
  ABSL_DCHECK(GetArena() == nullptr);
  _impl_.name_.Destroy();
  _impl_.type_url_.Destroy();
  _impl_.json_name_.Destroy();
  _impl_.default_value_.Destroy();
  _impl_.~Impl_();
}

PROTOBUF_CONSTINIT
PROTOBUF_ATTRIBUTE_INIT_PRIORITY1
const ::google::protobuf::MessageLite::ClassDataFull
    Field::_class_data_ = {
        ::google::protobuf::Message::ClassData{
            &_table_.header,
            nullptr,  // OnDemandRegisterArenaDtor
            nullptr,  // IsInitialized
            &Field::MergeImpl,
#if defined(PROTOBUF_CUSTOM_VTABLE)
            ::google::protobuf::Message::GetDeleteImpl<Field>(),
            ::google::protobuf::Message::GetNewImpl<Field>(),
            ::google::protobuf::Message::GetClearImpl<Field>(),
                ::google::protobuf::Message::GetByteSizeLongImpl<Field>(),
                ::google::protobuf::Message::GetSerializeImpl<Field>(),
#endif  // PROTOBUF_CUSTOM_VTABLE
            PROTOBUF_FIELD_OFFSET(Field, _impl_._cached_size_),
            false,
        },
        &Field::kDescriptorMethods,
        &descriptor_table_google_2fprotobuf_2ftype_2eproto,
        nullptr,  // tracker
};
const ::google::protobuf::MessageLite::ClassData* Field::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(_class_data_.tc_table);
  return _class_data_.base();
}
PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1
const ::_pbi::TcParseTable<4, 10, 1, 72, 2> Field::_table_ = {
  {
    0,  // no _has_bits_
    0, // no _extensions_
    11, 120,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    4294965264,  // skipmap
    offsetof(decltype(_table_), field_entries),
    10,  // num_field_entries
    1,  // num_aux_entries
    offsetof(decltype(_table_), aux_entries),
    &_Field_default_instance_._instance,
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::Field>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    {::_pbi::TcParser::MiniParse, {}},
    // .google.protobuf.Field.Kind kind = 1;
    {::_pbi::TcParser::SingularVarintNoZag1<::uint32_t, offsetof(Field, _impl_.kind_), 63>(),
     {8, 63, 0, PROTOBUF_FIELD_OFFSET(Field, _impl_.kind_)}},
    // .google.protobuf.Field.Cardinality cardinality = 2;
    {::_pbi::TcParser::SingularVarintNoZag1<::uint32_t, offsetof(Field, _impl_.cardinality_), 63>(),
     {16, 63, 0, PROTOBUF_FIELD_OFFSET(Field, _impl_.cardinality_)}},
    // int32 number = 3;
    {::_pbi::TcParser::SingularVarintNoZag1<::uint32_t, offsetof(Field, _impl_.number_), 63>(),
     {24, 63, 0, PROTOBUF_FIELD_OFFSET(Field, _impl_.number_)}},
    // string name = 4;
    {::_pbi::TcParser::FastUS1,
     {34, 63, 0, PROTOBUF_FIELD_OFFSET(Field, _impl_.name_)}},
    {::_pbi::TcParser::MiniParse, {}},
    // string type_url = 6;
    {::_pbi::TcParser::FastUS1,
     {50, 63, 0, PROTOBUF_FIELD_OFFSET(Field, _impl_.type_url_)}},
    // int32 oneof_index = 7;
    {::_pbi::TcParser::SingularVarintNoZag1<::uint32_t, offsetof(Field, _impl_.oneof_index_), 63>(),
     {56, 63, 0, PROTOBUF_FIELD_OFFSET(Field, _impl_.oneof_index_)}},
    // bool packed = 8;
    {::_pbi::TcParser::SingularVarintNoZag1<bool, offsetof(Field, _impl_.packed_), 63>(),
     {64, 63, 0, PROTOBUF_FIELD_OFFSET(Field, _impl_.packed_)}},
    // repeated .google.protobuf.Option options = 9;
    {::_pbi::TcParser::FastMtR1,
     {74, 63, 0, PROTOBUF_FIELD_OFFSET(Field, _impl_.options_)}},
    // string json_name = 10;
    {::_pbi::TcParser::FastUS1,
     {82, 63, 0, PROTOBUF_FIELD_OFFSET(Field, _impl_.json_name_)}},
    // string default_value = 11;
    {::_pbi::TcParser::FastUS1,
     {90, 63, 0, PROTOBUF_FIELD_OFFSET(Field, _impl_.default_value_)}},
    {::_pbi::TcParser::MiniParse, {}},
    {::_pbi::TcParser::MiniParse, {}},
    {::_pbi::TcParser::MiniParse, {}},
    {::_pbi::TcParser::MiniParse, {}},
  }}, {{
    65535, 65535
  }}, {{
    // .google.protobuf.Field.Kind kind = 1;
    {PROTOBUF_FIELD_OFFSET(Field, _impl_.kind_), 0, 0,
    (0 | ::_fl::kFcSingular | ::_fl::kOpenEnum)},
    // .google.protobuf.Field.Cardinality cardinality = 2;
    {PROTOBUF_FIELD_OFFSET(Field, _impl_.cardinality_), 0, 0,
    (0 | ::_fl::kFcSingular | ::_fl::kOpenEnum)},
    // int32 number = 3;
    {PROTOBUF_FIELD_OFFSET(Field, _impl_.number_), 0, 0,
    (0 | ::_fl::kFcSingular | ::_fl::kInt32)},
    // string name = 4;
    {PROTOBUF_FIELD_OFFSET(Field, _impl_.name_), 0, 0,
    (0 | ::_fl::kFcSingular | ::_fl::kUtf8String | ::_fl::kRepAString)},
    // string type_url = 6;
    {PROTOBUF_FIELD_OFFSET(Field, _impl_.type_url_), 0, 0,
    (0 | ::_fl::kFcSingular | ::_fl::kUtf8String | ::_fl::kRepAString)},
    // int32 oneof_index = 7;
    {PROTOBUF_FIELD_OFFSET(Field, _impl_.oneof_index_), 0, 0,
    (0 | ::_fl::kFcSingular | ::_fl::kInt32)},
    // bool packed = 8;
    {PROTOBUF_FIELD_OFFSET(Field, _impl_.packed_), 0, 0,
    (0 | ::_fl::kFcSingular | ::_fl::kBool)},
    // repeated .google.protobuf.Option options = 9;
    {PROTOBUF_FIELD_OFFSET(Field, _impl_.options_), 0, 0,
    (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)},
    // string json_name = 10;
    {PROTOBUF_FIELD_OFFSET(Field, _impl_.json_name_), 0, 0,
    (0 | ::_fl::kFcSingular | ::_fl::kUtf8String | ::_fl::kRepAString)},
    // string default_value = 11;
    {PROTOBUF_FIELD_OFFSET(Field, _impl_.default_value_), 0, 0,
    (0 | ::_fl::kFcSingular | ::_fl::kUtf8String | ::_fl::kRepAString)},
  }}, {{
    {::_pbi::TcParser::GetTable<::google::protobuf::Option>()},
  }}, {{
    "\25\0\0\0\4\10\0\0\0\11\15\0\0\0\0\0"
    "google.protobuf.Field"
    "name"
    "type_url"
    "json_name"
    "default_value"
  }},
};

PROTOBUF_NOINLINE void Field::Clear() {
// @@protoc_insertion_point(message_clear_start:google.protobuf.Field)
  ::google::protobuf::internal::TSanWrite(&_impl_);
  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void) cached_has_bits;

  _impl_.options_.Clear();
  _impl_.name_.ClearToEmpty();
  _impl_.type_url_.ClearToEmpty();
  _impl_.json_name_.ClearToEmpty();
  _impl_.default_value_.ClearToEmpty();
  ::memset(&_impl_.kind_, 0, static_cast<::size_t>(
      reinterpret_cast<char*>(&_impl_.packed_) -
      reinterpret_cast<char*>(&_impl_.kind_)) + sizeof(_impl_.packed_));
  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}

::uint8_t* Field::_InternalSerialize(
    ::uint8_t* target,
    ::google::protobuf::io::EpsCopyOutputStream* stream) const {
  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Field)
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  // .google.protobuf.Field.Kind kind = 1;
  if (this->_internal_kind() != 0) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteEnumToArray(
        1, this->_internal_kind(), target);
  }

  // .google.protobuf.Field.Cardinality cardinality = 2;
  if (this->_internal_cardinality() != 0) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteEnumToArray(
        2, this->_internal_cardinality(), target);
  }

  // int32 number = 3;
  if (this->_internal_number() != 0) {
    target = ::google::protobuf::internal::WireFormatLite::
        WriteInt32ToArrayWithField<3>(
            stream, this->_internal_number(), target);
  }

  // string name = 4;
  if (!this->_internal_name().empty()) {
    const std::string& _s = this->_internal_name();
    ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
        _s.data(), static_cast<int>(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.protobuf.Field.name");
    target = stream->WriteStringMaybeAliased(4, _s, target);
  }

  // string type_url = 6;
  if (!this->_internal_type_url().empty()) {
    const std::string& _s = this->_internal_type_url();
    ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
        _s.data(), static_cast<int>(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.protobuf.Field.type_url");
    target = stream->WriteStringMaybeAliased(6, _s, target);
  }

  // int32 oneof_index = 7;
  if (this->_internal_oneof_index() != 0) {
    target = ::google::protobuf::internal::WireFormatLite::
        WriteInt32ToArrayWithField<7>(
            stream, this->_internal_oneof_index(), target);
  }

  // bool packed = 8;
  if (this->_internal_packed() != 0) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteBoolToArray(
        8, this->_internal_packed(), target);
  }

  // repeated .google.protobuf.Option options = 9;
  for (unsigned i = 0, n = static_cast<unsigned>(
                           this->_internal_options_size());
       i < n; i++) {
    const auto& repfield = this->_internal_options().Get(i);
    target =
        ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
            9, repfield, repfield.GetCachedSize(),
            target, stream);
  }

  // string json_name = 10;
  if (!this->_internal_json_name().empty()) {
    const std::string& _s = this->_internal_json_name();
    ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
        _s.data(), static_cast<int>(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.protobuf.Field.json_name");
    target = stream->WriteStringMaybeAliased(10, _s, target);
  }

  // string default_value = 11;
  if (!this->_internal_default_value().empty()) {
    const std::string& _s = this->_internal_default_value();
    ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
        _s.data(), static_cast<int>(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.protobuf.Field.default_value");
    target = stream->WriteStringMaybeAliased(11, _s, target);
  }

  if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) {
    target =
        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
            _internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
  }
  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.Field)
  return target;
}

::size_t Field::ByteSizeLong() const {
  // @@protoc_insertion_point(message_byte_size_start:google.protobuf.Field)
  ::size_t total_size = 0;

  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void)cached_has_bits;

  ::_pbi::Prefetch5LinesFrom7Lines(
      reinterpret_cast<const void*>(this));
   {
    // repeated .google.protobuf.Option options = 9;
     {
      total_size += 1UL * this->_internal_options_size();
      for (const auto& msg : this->_internal_options()) {
        total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg);
      }
    }
  }
   {
    // string name = 4;
    if (!this->_internal_name().empty()) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this->_internal_name());
    }
    // string type_url = 6;
    if (!this->_internal_type_url().empty()) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this->_internal_type_url());
    }
    // string json_name = 10;
    if (!this->_internal_json_name().empty()) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this->_internal_json_name());
    }
    // string default_value = 11;
    if (!this->_internal_default_value().empty()) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this->_internal_default_value());
    }
    // .google.protobuf.Field.Kind kind = 1;
    if (this->_internal_kind() != 0) {
      total_size += 1 +
                    ::_pbi::WireFormatLite::EnumSize(this->_internal_kind());
    }
    // .google.protobuf.Field.Cardinality cardinality = 2;
    if (this->_internal_cardinality() != 0) {
      total_size += 1 +
                    ::_pbi::WireFormatLite::EnumSize(this->_internal_cardinality());
    }
    // int32 number = 3;
    if (this->_internal_number() != 0) {
      total_size += ::_pbi::WireFormatLite::Int32SizePlusOne(
          this->_internal_number());
    }
    // int32 oneof_index = 7;
    if (this->_internal_oneof_index() != 0) {
      total_size += ::_pbi::WireFormatLite::Int32SizePlusOne(
          this->_internal_oneof_index());
    }
    // bool packed = 8;
    if (this->_internal_packed() != 0) {
      total_size += 2;
    }
  }
  return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_);
}

void Field::MergeImpl(::google::protobuf::MessageLite& to_msg, const ::google::protobuf::MessageLite& from_msg) {
  auto* const _this = static_cast<Field*>(&to_msg);
  auto& from = static_cast<const Field&>(from_msg);
  // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.Field)
  ABSL_DCHECK_NE(&from, _this);
  ::uint32_t cached_has_bits = 0;
  (void) cached_has_bits;

  _this->_internal_mutable_options()->MergeFrom(
      from._internal_options());
  if (!from._internal_name().empty()) {
    _this->_internal_set_name(from._internal_name());
  }
  if (!from._internal_type_url().empty()) {
    _this->_internal_set_type_url(from._internal_type_url());
  }
  if (!from._internal_json_name().empty()) {
    _this->_internal_set_json_name(from._internal_json_name());
  }
  if (!from._internal_default_value().empty()) {
    _this->_internal_set_default_value(from._internal_default_value());
  }
  if (from._internal_kind() != 0) {
    _this->_impl_.kind_ = from._impl_.kind_;
  }
  if (from._internal_cardinality() != 0) {
    _this->_impl_.cardinality_ = from._impl_.cardinality_;
  }
  if (from._internal_number() != 0) {
    _this->_impl_.number_ = from._impl_.number_;
  }
  if (from._internal_oneof_index() != 0) {
    _this->_impl_.oneof_index_ = from._impl_.oneof_index_;
  }
  if (from._internal_packed() != 0) {
    _this->_impl_.packed_ = from._impl_.packed_;
  }
  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(from._internal_metadata_);
}

void Field::CopyFrom(const Field& from) {
// @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.Field)
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}


void Field::InternalSwap(Field* PROTOBUF_RESTRICT other) {
  using std::swap;
  auto* arena = GetArena();
  ABSL_DCHECK_EQ(arena, other->GetArena());
  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
  _impl_.options_.InternalSwap(&other->_impl_.options_);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.name_, &other->_impl_.name_, arena);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.type_url_, &other->_impl_.type_url_, arena);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.json_name_, &other->_impl_.json_name_, arena);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.default_value_, &other->_impl_.default_value_, arena);
  ::google::protobuf::internal::memswap<
      PROTOBUF_FIELD_OFFSET(Field, _impl_.packed_)
      + sizeof(Field::_impl_.packed_)
      - PROTOBUF_FIELD_OFFSET(Field, _impl_.kind_)>(
          reinterpret_cast<char*>(&_impl_.kind_),
          reinterpret_cast<char*>(&other->_impl_.kind_));
}

::google::protobuf::Metadata Field::GetMetadata() const {
  return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// ===================================================================

class Enum::_Internal {
 public:
  using HasBits =
      decltype(std::declval<Enum>()._impl_._has_bits_);
  static constexpr ::int32_t kHasBitsOffset =
      8 * PROTOBUF_FIELD_OFFSET(Enum, _impl_._has_bits_);
};

void Enum::clear_source_context() {
  ::google::protobuf::internal::TSanWrite(&_impl_);
  if (_impl_.source_context_ != nullptr) _impl_.source_context_->Clear();
  _impl_._has_bits_[0] &= ~0x00000001u;
}
Enum::Enum(::google::protobuf::Arena* arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, _class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SharedCtor(arena);
  // @@protoc_insertion_point(arena_constructor:google.protobuf.Enum)
}
inline PROTOBUF_NDEBUG_INLINE Enum::Impl_::Impl_(
    ::google::protobuf::internal::InternalVisibility visibility, ::google::protobuf::Arena* arena,
    const Impl_& from, const ::google::protobuf::Enum& from_msg)
      : _has_bits_{from._has_bits_},
        _cached_size_{0},
        enumvalue_{visibility, arena, from.enumvalue_},
        options_{visibility, arena, from.options_},
        name_(arena, from.name_),
        edition_(arena, from.edition_) {}

Enum::Enum(
    ::google::protobuf::Arena* arena,
    const Enum& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, _class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  Enum* const _this = this;
  (void)_this;
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
  new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from);
  ::uint32_t cached_has_bits = _impl_._has_bits_[0];
  _impl_.source_context_ = (cached_has_bits & 0x00000001u) ? ::google::protobuf::Message::CopyConstruct<::google::protobuf::SourceContext>(
                              arena, *from._impl_.source_context_)
                        : nullptr;
  _impl_.syntax_ = from._impl_.syntax_;

  // @@protoc_insertion_point(copy_constructor:google.protobuf.Enum)
}
inline PROTOBUF_NDEBUG_INLINE Enum::Impl_::Impl_(
    ::google::protobuf::internal::InternalVisibility visibility,
    ::google::protobuf::Arena* arena)
      : _cached_size_{0},
        enumvalue_{visibility, arena},
        options_{visibility, arena},
        name_(arena),
        edition_(arena) {}

inline void Enum::SharedCtor(::_pb::Arena* arena) {
  new (&_impl_) Impl_(internal_visibility(), arena);
  ::memset(reinterpret_cast<char *>(&_impl_) +
               offsetof(Impl_, source_context_),
           0,
           offsetof(Impl_, syntax_) -
               offsetof(Impl_, source_context_) +
               sizeof(Impl_::syntax_));
}
Enum::~Enum() {
  // @@protoc_insertion_point(destructor:google.protobuf.Enum)
  _internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
  SharedDtor();
}
inline void Enum::SharedDtor() {
  ABSL_DCHECK(GetArena() == nullptr);
  _impl_.name_.Destroy();
  _impl_.edition_.Destroy();
  delete _impl_.source_context_;
  _impl_.~Impl_();
}

PROTOBUF_CONSTINIT
PROTOBUF_ATTRIBUTE_INIT_PRIORITY1
const ::google::protobuf::MessageLite::ClassDataFull
    Enum::_class_data_ = {
        ::google::protobuf::Message::ClassData{
            &_table_.header,
            nullptr,  // OnDemandRegisterArenaDtor
            nullptr,  // IsInitialized
            &Enum::MergeImpl,
#if defined(PROTOBUF_CUSTOM_VTABLE)
            ::google::protobuf::Message::GetDeleteImpl<Enum>(),
            ::google::protobuf::Message::GetNewImpl<Enum>(),
            ::google::protobuf::Message::GetClearImpl<Enum>(),
                ::google::protobuf::Message::GetByteSizeLongImpl<Enum>(),
                ::google::protobuf::Message::GetSerializeImpl<Enum>(),
#endif  // PROTOBUF_CUSTOM_VTABLE
            PROTOBUF_FIELD_OFFSET(Enum, _impl_._cached_size_),
            false,
        },
        &Enum::kDescriptorMethods,
        &descriptor_table_google_2fprotobuf_2ftype_2eproto,
        nullptr,  // tracker
};
const ::google::protobuf::MessageLite::ClassData* Enum::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(_class_data_.tc_table);
  return _class_data_.base();
}
PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1
const ::_pbi::TcParseTable<3, 6, 3, 40, 2> Enum::_table_ = {
  {
    PROTOBUF_FIELD_OFFSET(Enum, _impl_._has_bits_),
    0, // no _extensions_
    6, 56,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    4294967232,  // skipmap
    offsetof(decltype(_table_), field_entries),
    6,  // num_field_entries
    3,  // num_aux_entries
    offsetof(decltype(_table_), aux_entries),
    &_Enum_default_instance_._instance,
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::Enum>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    {::_pbi::TcParser::MiniParse, {}},
    // string name = 1;
    {::_pbi::TcParser::FastUS1,
     {10, 63, 0, PROTOBUF_FIELD_OFFSET(Enum, _impl_.name_)}},
    // repeated .google.protobuf.EnumValue enumvalue = 2;
    {::_pbi::TcParser::FastMtR1,
     {18, 63, 0, PROTOBUF_FIELD_OFFSET(Enum, _impl_.enumvalue_)}},
    // repeated .google.protobuf.Option options = 3;
    {::_pbi::TcParser::FastMtR1,
     {26, 63, 1, PROTOBUF_FIELD_OFFSET(Enum, _impl_.options_)}},
    // .google.protobuf.SourceContext source_context = 4;
    {::_pbi::TcParser::FastMtS1,
     {34, 0, 2, PROTOBUF_FIELD_OFFSET(Enum, _impl_.source_context_)}},
    // .google.protobuf.Syntax syntax = 5;
    {::_pbi::TcParser::SingularVarintNoZag1<::uint32_t, offsetof(Enum, _impl_.syntax_), 63>(),
     {40, 63, 0, PROTOBUF_FIELD_OFFSET(Enum, _impl_.syntax_)}},
    // string edition = 6;
    {::_pbi::TcParser::FastUS1,
     {50, 63, 0, PROTOBUF_FIELD_OFFSET(Enum, _impl_.edition_)}},
    {::_pbi::TcParser::MiniParse, {}},
  }}, {{
    65535, 65535
  }}, {{
    // string name = 1;
    {PROTOBUF_FIELD_OFFSET(Enum, _impl_.name_), -1, 0,
    (0 | ::_fl::kFcSingular | ::_fl::kUtf8String | ::_fl::kRepAString)},
    // repeated .google.protobuf.EnumValue enumvalue = 2;
    {PROTOBUF_FIELD_OFFSET(Enum, _impl_.enumvalue_), -1, 0,
    (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)},
    // repeated .google.protobuf.Option options = 3;
    {PROTOBUF_FIELD_OFFSET(Enum, _impl_.options_), -1, 1,
    (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)},
    // .google.protobuf.SourceContext source_context = 4;
    {PROTOBUF_FIELD_OFFSET(Enum, _impl_.source_context_), _Internal::kHasBitsOffset + 0, 2,
    (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)},
    // .google.protobuf.Syntax syntax = 5;
    {PROTOBUF_FIELD_OFFSET(Enum, _impl_.syntax_), -1, 0,
    (0 | ::_fl::kFcSingular | ::_fl::kOpenEnum)},
    // string edition = 6;
    {PROTOBUF_FIELD_OFFSET(Enum, _impl_.edition_), -1, 0,
    (0 | ::_fl::kFcSingular | ::_fl::kUtf8String | ::_fl::kRepAString)},
  }}, {{
    {::_pbi::TcParser::GetTable<::google::protobuf::EnumValue>()},
    {::_pbi::TcParser::GetTable<::google::protobuf::Option>()},
    {::_pbi::TcParser::GetTable<::google::protobuf::SourceContext>()},
  }}, {{
    "\24\4\0\0\0\0\7\0"
    "google.protobuf.Enum"
    "name"
    "edition"
  }},
};

PROTOBUF_NOINLINE void Enum::Clear() {
// @@protoc_insertion_point(message_clear_start:google.protobuf.Enum)
  ::google::protobuf::internal::TSanWrite(&_impl_);
  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void) cached_has_bits;

  _impl_.enumvalue_.Clear();
  _impl_.options_.Clear();
  _impl_.name_.ClearToEmpty();
  _impl_.edition_.ClearToEmpty();
  cached_has_bits = _impl_._has_bits_[0];
  if (cached_has_bits & 0x00000001u) {
    ABSL_DCHECK(_impl_.source_context_ != nullptr);
    _impl_.source_context_->Clear();
  }
  _impl_.syntax_ = 0;
  _impl_._has_bits_.Clear();
  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}

::uint8_t* Enum::_InternalSerialize(
    ::uint8_t* target,
    ::google::protobuf::io::EpsCopyOutputStream* stream) const {
  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Enum)
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  // string name = 1;
  if (!this->_internal_name().empty()) {
    const std::string& _s = this->_internal_name();
    ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
        _s.data(), static_cast<int>(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.protobuf.Enum.name");
    target = stream->WriteStringMaybeAliased(1, _s, target);
  }

  // repeated .google.protobuf.EnumValue enumvalue = 2;
  for (unsigned i = 0, n = static_cast<unsigned>(
                           this->_internal_enumvalue_size());
       i < n; i++) {
    const auto& repfield = this->_internal_enumvalue().Get(i);
    target =
        ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
            2, repfield, repfield.GetCachedSize(),
            target, stream);
  }

  // repeated .google.protobuf.Option options = 3;
  for (unsigned i = 0, n = static_cast<unsigned>(
                           this->_internal_options_size());
       i < n; i++) {
    const auto& repfield = this->_internal_options().Get(i);
    target =
        ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
            3, repfield, repfield.GetCachedSize(),
            target, stream);
  }

  cached_has_bits = _impl_._has_bits_[0];
  // .google.protobuf.SourceContext source_context = 4;
  if (cached_has_bits & 0x00000001u) {
    target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
        4, *_impl_.source_context_, _impl_.source_context_->GetCachedSize(), target, stream);
  }

  // .google.protobuf.Syntax syntax = 5;
  if (this->_internal_syntax() != 0) {
    target = stream->EnsureSpace(target);
    target = ::_pbi::WireFormatLite::WriteEnumToArray(
        5, this->_internal_syntax(), target);
  }

  // string edition = 6;
  if (!this->_internal_edition().empty()) {
    const std::string& _s = this->_internal_edition();
    ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
        _s.data(), static_cast<int>(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.protobuf.Enum.edition");
    target = stream->WriteStringMaybeAliased(6, _s, target);
  }

  if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) {
    target =
        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
            _internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
  }
  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.Enum)
  return target;
}

::size_t Enum::ByteSizeLong() const {
  // @@protoc_insertion_point(message_byte_size_start:google.protobuf.Enum)
  ::size_t total_size = 0;

  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void)cached_has_bits;

  ::_pbi::Prefetch5LinesFrom7Lines(
      reinterpret_cast<const void*>(this));
   {
    // repeated .google.protobuf.EnumValue enumvalue = 2;
     {
      total_size += 1UL * this->_internal_enumvalue_size();
      for (const auto& msg : this->_internal_enumvalue()) {
        total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg);
      }
    }
    // repeated .google.protobuf.Option options = 3;
     {
      total_size += 1UL * this->_internal_options_size();
      for (const auto& msg : this->_internal_options()) {
        total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg);
      }
    }
  }
   {
    // string name = 1;
    if (!this->_internal_name().empty()) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this->_internal_name());
    }
    // string edition = 6;
    if (!this->_internal_edition().empty()) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this->_internal_edition());
    }
  }
   {
    // .google.protobuf.SourceContext source_context = 4;
    cached_has_bits = _impl_._has_bits_[0];
    if (cached_has_bits & 0x00000001u) {
      total_size +=
          1 + ::google::protobuf::internal::WireFormatLite::MessageSize(*_impl_.source_context_);
    }
  }
   {
    // .google.protobuf.Syntax syntax = 5;
    if (this->_internal_syntax() != 0) {
      total_size += 1 +
                    ::_pbi::WireFormatLite::EnumSize(this->_internal_syntax());
    }
  }
  return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_);
}

void Enum::MergeImpl(::google::protobuf::MessageLite& to_msg, const ::google::protobuf::MessageLite& from_msg) {
  auto* const _this = static_cast<Enum*>(&to_msg);
  auto& from = static_cast<const Enum&>(from_msg);
  ::google::protobuf::Arena* arena = _this->GetArena();
  // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.Enum)
  ABSL_DCHECK_NE(&from, _this);
  ::uint32_t cached_has_bits = 0;
  (void) cached_has_bits;

  _this->_internal_mutable_enumvalue()->MergeFrom(
      from._internal_enumvalue());
  _this->_internal_mutable_options()->MergeFrom(
      from._internal_options());
  if (!from._internal_name().empty()) {
    _this->_internal_set_name(from._internal_name());
  }
  if (!from._internal_edition().empty()) {
    _this->_internal_set_edition(from._internal_edition());
  }
  cached_has_bits = from._impl_._has_bits_[0];
  if (cached_has_bits & 0x00000001u) {
    ABSL_DCHECK(from._impl_.source_context_ != nullptr);
    if (_this->_impl_.source_context_ == nullptr) {
      _this->_impl_.source_context_ =
          ::google::protobuf::Message::CopyConstruct<::google::protobuf::SourceContext>(arena, *from._impl_.source_context_);
    } else {
      _this->_impl_.source_context_->MergeFrom(*from._impl_.source_context_);
    }
  }
  if (from._internal_syntax() != 0) {
    _this->_impl_.syntax_ = from._impl_.syntax_;
  }
  _this->_impl_._has_bits_[0] |= cached_has_bits;
  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(from._internal_metadata_);
}

void Enum::CopyFrom(const Enum& from) {
// @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.Enum)
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}


void Enum::InternalSwap(Enum* PROTOBUF_RESTRICT other) {
  using std::swap;
  auto* arena = GetArena();
  ABSL_DCHECK_EQ(arena, other->GetArena());
  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
  swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]);
  _impl_.enumvalue_.InternalSwap(&other->_impl_.enumvalue_);
  _impl_.options_.InternalSwap(&other->_impl_.options_);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.name_, &other->_impl_.name_, arena);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.edition_, &other->_impl_.edition_, arena);
  ::google::protobuf::internal::memswap<
      PROTOBUF_FIELD_OFFSET(Enum, _impl_.syntax_)
      + sizeof(Enum::_impl_.syntax_)
      - PROTOBUF_FIELD_OFFSET(Enum, _impl_.source_context_)>(
          reinterpret_cast<char*>(&_impl_.source_context_),
          reinterpret_cast<char*>(&other->_impl_.source_context_));
}

::google::protobuf::Metadata Enum::GetMetadata() const {
  return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// ===================================================================

class EnumValue::_Internal {
 public:
};

EnumValue::EnumValue(::google::protobuf::Arena* arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, _class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SharedCtor(arena);
  // @@protoc_insertion_point(arena_constructor:google.protobuf.EnumValue)
}
inline PROTOBUF_NDEBUG_INLINE EnumValue::Impl_::Impl_(
    ::google::protobuf::internal::InternalVisibility visibility, ::google::protobuf::Arena* arena,
    const Impl_& from, const ::google::protobuf::EnumValue& from_msg)
      : options_{visibility, arena, from.options_},
        name_(arena, from.name_),
        _cached_size_{0} {}

EnumValue::EnumValue(
    ::google::protobuf::Arena* arena,
    const EnumValue& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, _class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  EnumValue* const _this = this;
  (void)_this;
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
  new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from);
  _impl_.number_ = from._impl_.number_;

  // @@protoc_insertion_point(copy_constructor:google.protobuf.EnumValue)
}
inline PROTOBUF_NDEBUG_INLINE EnumValue::Impl_::Impl_(
    ::google::protobuf::internal::InternalVisibility visibility,
    ::google::protobuf::Arena* arena)
      : options_{visibility, arena},
        name_(arena),
        _cached_size_{0} {}

inline void EnumValue::SharedCtor(::_pb::Arena* arena) {
  new (&_impl_) Impl_(internal_visibility(), arena);
  _impl_.number_ = {};
}
EnumValue::~EnumValue() {
  // @@protoc_insertion_point(destructor:google.protobuf.EnumValue)
  _internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
  SharedDtor();
}
inline void EnumValue::SharedDtor() {
  ABSL_DCHECK(GetArena() == nullptr);
  _impl_.name_.Destroy();
  _impl_.~Impl_();
}

PROTOBUF_CONSTINIT
PROTOBUF_ATTRIBUTE_INIT_PRIORITY1
const ::google::protobuf::MessageLite::ClassDataFull
    EnumValue::_class_data_ = {
        ::google::protobuf::Message::ClassData{
            &_table_.header,
            nullptr,  // OnDemandRegisterArenaDtor
            nullptr,  // IsInitialized
            &EnumValue::MergeImpl,
#if defined(PROTOBUF_CUSTOM_VTABLE)
            ::google::protobuf::Message::GetDeleteImpl<EnumValue>(),
            ::google::protobuf::Message::GetNewImpl<EnumValue>(),
            ::google::protobuf::Message::GetClearImpl<EnumValue>(),
                ::google::protobuf::Message::GetByteSizeLongImpl<EnumValue>(),
                ::google::protobuf::Message::GetSerializeImpl<EnumValue>(),
#endif  // PROTOBUF_CUSTOM_VTABLE
            PROTOBUF_FIELD_OFFSET(EnumValue, _impl_._cached_size_),
            false,
        },
        &EnumValue::kDescriptorMethods,
        &descriptor_table_google_2fprotobuf_2ftype_2eproto,
        nullptr,  // tracker
};
const ::google::protobuf::MessageLite::ClassData* EnumValue::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(_class_data_.tc_table);
  return _class_data_.base();
}
PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1
const ::_pbi::TcParseTable<2, 3, 1, 38, 2> EnumValue::_table_ = {
  {
    0,  // no _has_bits_
    0, // no _extensions_
    3, 24,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    4294967288,  // skipmap
    offsetof(decltype(_table_), field_entries),
    3,  // num_field_entries
    1,  // num_aux_entries
    offsetof(decltype(_table_), aux_entries),
    &_EnumValue_default_instance_._instance,
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::EnumValue>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    {::_pbi::TcParser::MiniParse, {}},
    // string name = 1;
    {::_pbi::TcParser::FastUS1,
     {10, 63, 0, PROTOBUF_FIELD_OFFSET(EnumValue, _impl_.name_)}},
    // int32 number = 2;
    {::_pbi::TcParser::SingularVarintNoZag1<::uint32_t, offsetof(EnumValue, _impl_.number_), 63>(),
     {16, 63, 0, PROTOBUF_FIELD_OFFSET(EnumValue, _impl_.number_)}},
    // repeated .google.protobuf.Option options = 3;
    {::_pbi::TcParser::FastMtR1,
     {26, 63, 0, PROTOBUF_FIELD_OFFSET(EnumValue, _impl_.options_)}},
  }}, {{
    65535, 65535
  }}, {{
    // string name = 1;
    {PROTOBUF_FIELD_OFFSET(EnumValue, _impl_.name_), 0, 0,
    (0 | ::_fl::kFcSingular | ::_fl::kUtf8String | ::_fl::kRepAString)},
    // int32 number = 2;
    {PROTOBUF_FIELD_OFFSET(EnumValue, _impl_.number_), 0, 0,
    (0 | ::_fl::kFcSingular | ::_fl::kInt32)},
    // repeated .google.protobuf.Option options = 3;
    {PROTOBUF_FIELD_OFFSET(EnumValue, _impl_.options_), 0, 0,
    (0 | ::_fl::kFcRepeated | ::_fl::kMessage | ::_fl::kTvTable)},
  }}, {{
    {::_pbi::TcParser::GetTable<::google::protobuf::Option>()},
  }}, {{
    "\31\4\0\0\0\0\0\0"
    "google.protobuf.EnumValue"
    "name"
  }},
};

PROTOBUF_NOINLINE void EnumValue::Clear() {
// @@protoc_insertion_point(message_clear_start:google.protobuf.EnumValue)
  ::google::protobuf::internal::TSanWrite(&_impl_);
  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void) cached_has_bits;

  _impl_.options_.Clear();
  _impl_.name_.ClearToEmpty();
  _impl_.number_ = 0;
  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}

::uint8_t* EnumValue::_InternalSerialize(
    ::uint8_t* target,
    ::google::protobuf::io::EpsCopyOutputStream* stream) const {
  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.EnumValue)
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  // string name = 1;
  if (!this->_internal_name().empty()) {
    const std::string& _s = this->_internal_name();
    ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
        _s.data(), static_cast<int>(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.protobuf.EnumValue.name");
    target = stream->WriteStringMaybeAliased(1, _s, target);
  }

  // int32 number = 2;
  if (this->_internal_number() != 0) {
    target = ::google::protobuf::internal::WireFormatLite::
        WriteInt32ToArrayWithField<2>(
            stream, this->_internal_number(), target);
  }

  // repeated .google.protobuf.Option options = 3;
  for (unsigned i = 0, n = static_cast<unsigned>(
                           this->_internal_options_size());
       i < n; i++) {
    const auto& repfield = this->_internal_options().Get(i);
    target =
        ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
            3, repfield, repfield.GetCachedSize(),
            target, stream);
  }

  if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) {
    target =
        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
            _internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
  }
  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.EnumValue)
  return target;
}

::size_t EnumValue::ByteSizeLong() const {
  // @@protoc_insertion_point(message_byte_size_start:google.protobuf.EnumValue)
  ::size_t total_size = 0;

  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void)cached_has_bits;

  ::_pbi::Prefetch5LinesFrom7Lines(
      reinterpret_cast<const void*>(this));
   {
    // repeated .google.protobuf.Option options = 3;
     {
      total_size += 1UL * this->_internal_options_size();
      for (const auto& msg : this->_internal_options()) {
        total_size += ::google::protobuf::internal::WireFormatLite::MessageSize(msg);
      }
    }
  }
   {
    // string name = 1;
    if (!this->_internal_name().empty()) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this->_internal_name());
    }
    // int32 number = 2;
    if (this->_internal_number() != 0) {
      total_size += ::_pbi::WireFormatLite::Int32SizePlusOne(
          this->_internal_number());
    }
  }
  return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_);
}

void EnumValue::MergeImpl(::google::protobuf::MessageLite& to_msg, const ::google::protobuf::MessageLite& from_msg) {
  auto* const _this = static_cast<EnumValue*>(&to_msg);
  auto& from = static_cast<const EnumValue&>(from_msg);
  // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.EnumValue)
  ABSL_DCHECK_NE(&from, _this);
  ::uint32_t cached_has_bits = 0;
  (void) cached_has_bits;

  _this->_internal_mutable_options()->MergeFrom(
      from._internal_options());
  if (!from._internal_name().empty()) {
    _this->_internal_set_name(from._internal_name());
  }
  if (from._internal_number() != 0) {
    _this->_impl_.number_ = from._impl_.number_;
  }
  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(from._internal_metadata_);
}

void EnumValue::CopyFrom(const EnumValue& from) {
// @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.EnumValue)
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}


void EnumValue::InternalSwap(EnumValue* PROTOBUF_RESTRICT other) {
  using std::swap;
  auto* arena = GetArena();
  ABSL_DCHECK_EQ(arena, other->GetArena());
  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
  _impl_.options_.InternalSwap(&other->_impl_.options_);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.name_, &other->_impl_.name_, arena);
        swap(_impl_.number_, other->_impl_.number_);
}

::google::protobuf::Metadata EnumValue::GetMetadata() const {
  return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// ===================================================================

class Option::_Internal {
 public:
  using HasBits =
      decltype(std::declval<Option>()._impl_._has_bits_);
  static constexpr ::int32_t kHasBitsOffset =
      8 * PROTOBUF_FIELD_OFFSET(Option, _impl_._has_bits_);
};

void Option::clear_value() {
  ::google::protobuf::internal::TSanWrite(&_impl_);
  if (_impl_.value_ != nullptr) _impl_.value_->Clear();
  _impl_._has_bits_[0] &= ~0x00000001u;
}
Option::Option(::google::protobuf::Arena* arena)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, _class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  SharedCtor(arena);
  // @@protoc_insertion_point(arena_constructor:google.protobuf.Option)
}
inline PROTOBUF_NDEBUG_INLINE Option::Impl_::Impl_(
    ::google::protobuf::internal::InternalVisibility visibility, ::google::protobuf::Arena* arena,
    const Impl_& from, const ::google::protobuf::Option& from_msg)
      : _has_bits_{from._has_bits_},
        _cached_size_{0},
        name_(arena, from.name_) {}

Option::Option(
    ::google::protobuf::Arena* arena,
    const Option& from)
#if defined(PROTOBUF_CUSTOM_VTABLE)
    : ::google::protobuf::Message(arena, _class_data_.base()) {
#else   // PROTOBUF_CUSTOM_VTABLE
    : ::google::protobuf::Message(arena) {
#endif  // PROTOBUF_CUSTOM_VTABLE
  Option* const _this = this;
  (void)_this;
  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
      from._internal_metadata_);
  new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from);
  ::uint32_t cached_has_bits = _impl_._has_bits_[0];
  _impl_.value_ = (cached_has_bits & 0x00000001u) ? ::google::protobuf::Message::CopyConstruct<::google::protobuf::Any>(
                              arena, *from._impl_.value_)
                        : nullptr;

  // @@protoc_insertion_point(copy_constructor:google.protobuf.Option)
}
inline PROTOBUF_NDEBUG_INLINE Option::Impl_::Impl_(
    ::google::protobuf::internal::InternalVisibility visibility,
    ::google::protobuf::Arena* arena)
      : _cached_size_{0},
        name_(arena) {}

inline void Option::SharedCtor(::_pb::Arena* arena) {
  new (&_impl_) Impl_(internal_visibility(), arena);
  _impl_.value_ = {};
}
Option::~Option() {
  // @@protoc_insertion_point(destructor:google.protobuf.Option)
  _internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
  SharedDtor();
}
inline void Option::SharedDtor() {
  ABSL_DCHECK(GetArena() == nullptr);
  _impl_.name_.Destroy();
  delete _impl_.value_;
  _impl_.~Impl_();
}

PROTOBUF_CONSTINIT
PROTOBUF_ATTRIBUTE_INIT_PRIORITY1
const ::google::protobuf::MessageLite::ClassDataFull
    Option::_class_data_ = {
        ::google::protobuf::Message::ClassData{
            &_table_.header,
            nullptr,  // OnDemandRegisterArenaDtor
            nullptr,  // IsInitialized
            &Option::MergeImpl,
#if defined(PROTOBUF_CUSTOM_VTABLE)
            ::google::protobuf::Message::GetDeleteImpl<Option>(),
            ::google::protobuf::Message::GetNewImpl<Option>(),
            ::google::protobuf::Message::GetClearImpl<Option>(),
                ::google::protobuf::Message::GetByteSizeLongImpl<Option>(),
                ::google::protobuf::Message::GetSerializeImpl<Option>(),
#endif  // PROTOBUF_CUSTOM_VTABLE
            PROTOBUF_FIELD_OFFSET(Option, _impl_._cached_size_),
            false,
        },
        &Option::kDescriptorMethods,
        &descriptor_table_google_2fprotobuf_2ftype_2eproto,
        nullptr,  // tracker
};
const ::google::protobuf::MessageLite::ClassData* Option::GetClassData() const {
  ::google::protobuf::internal::PrefetchToLocalCache(&_class_data_);
  ::google::protobuf::internal::PrefetchToLocalCache(_class_data_.tc_table);
  return _class_data_.base();
}
PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1
const ::_pbi::TcParseTable<1, 2, 1, 35, 2> Option::_table_ = {
  {
    PROTOBUF_FIELD_OFFSET(Option, _impl_._has_bits_),
    0, // no _extensions_
    2, 8,  // max_field_number, fast_idx_mask
    offsetof(decltype(_table_), field_lookup_table),
    4294967292,  // skipmap
    offsetof(decltype(_table_), field_entries),
    2,  // num_field_entries
    1,  // num_aux_entries
    offsetof(decltype(_table_), aux_entries),
    &_Option_default_instance_._instance,
    nullptr,  // post_loop_handler
    ::_pbi::TcParser::GenericFallback,  // fallback
    #ifdef PROTOBUF_PREFETCH_PARSE_TABLE
    ::_pbi::TcParser::GetTable<::google::protobuf::Option>(),  // to_prefetch
    #endif  // PROTOBUF_PREFETCH_PARSE_TABLE
  }, {{
    // .google.protobuf.Any value = 2;
    {::_pbi::TcParser::FastMtS1,
     {18, 0, 0, PROTOBUF_FIELD_OFFSET(Option, _impl_.value_)}},
    // string name = 1;
    {::_pbi::TcParser::FastUS1,
     {10, 63, 0, PROTOBUF_FIELD_OFFSET(Option, _impl_.name_)}},
  }}, {{
    65535, 65535
  }}, {{
    // string name = 1;
    {PROTOBUF_FIELD_OFFSET(Option, _impl_.name_), -1, 0,
    (0 | ::_fl::kFcSingular | ::_fl::kUtf8String | ::_fl::kRepAString)},
    // .google.protobuf.Any value = 2;
    {PROTOBUF_FIELD_OFFSET(Option, _impl_.value_), _Internal::kHasBitsOffset + 0, 0,
    (0 | ::_fl::kFcOptional | ::_fl::kMessage | ::_fl::kTvTable)},
  }}, {{
    {::_pbi::TcParser::GetTable<::google::protobuf::Any>()},
  }}, {{
    "\26\4\0\0\0\0\0\0"
    "google.protobuf.Option"
    "name"
  }},
};

PROTOBUF_NOINLINE void Option::Clear() {
// @@protoc_insertion_point(message_clear_start:google.protobuf.Option)
  ::google::protobuf::internal::TSanWrite(&_impl_);
  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void) cached_has_bits;

  _impl_.name_.ClearToEmpty();
  cached_has_bits = _impl_._has_bits_[0];
  if (cached_has_bits & 0x00000001u) {
    ABSL_DCHECK(_impl_.value_ != nullptr);
    _impl_.value_->Clear();
  }
  _impl_._has_bits_.Clear();
  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
}

::uint8_t* Option::_InternalSerialize(
    ::uint8_t* target,
    ::google::protobuf::io::EpsCopyOutputStream* stream) const {
  // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Option)
  ::uint32_t cached_has_bits = 0;
  (void)cached_has_bits;

  // string name = 1;
  if (!this->_internal_name().empty()) {
    const std::string& _s = this->_internal_name();
    ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
        _s.data(), static_cast<int>(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.protobuf.Option.name");
    target = stream->WriteStringMaybeAliased(1, _s, target);
  }

  cached_has_bits = _impl_._has_bits_[0];
  // .google.protobuf.Any value = 2;
  if (cached_has_bits & 0x00000001u) {
    target = ::google::protobuf::internal::WireFormatLite::InternalWriteMessage(
        2, *_impl_.value_, _impl_.value_->GetCachedSize(), target, stream);
  }

  if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) {
    target =
        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
            _internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
  }
  // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.Option)
  return target;
}

::size_t Option::ByteSizeLong() const {
  // @@protoc_insertion_point(message_byte_size_start:google.protobuf.Option)
  ::size_t total_size = 0;

  ::uint32_t cached_has_bits = 0;
  // Prevent compiler warnings about cached_has_bits being unused
  (void)cached_has_bits;

  ::_pbi::Prefetch5LinesFrom7Lines(
      reinterpret_cast<const void*>(this));
   {
    // string name = 1;
    if (!this->_internal_name().empty()) {
      total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                      this->_internal_name());
    }
  }
   {
    // .google.protobuf.Any value = 2;
    cached_has_bits = _impl_._has_bits_[0];
    if (cached_has_bits & 0x00000001u) {
      total_size +=
          1 + ::google::protobuf::internal::WireFormatLite::MessageSize(*_impl_.value_);
    }
  }
  return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_);
}

void Option::MergeImpl(::google::protobuf::MessageLite& to_msg, const ::google::protobuf::MessageLite& from_msg) {
  auto* const _this = static_cast<Option*>(&to_msg);
  auto& from = static_cast<const Option&>(from_msg);
  ::google::protobuf::Arena* arena = _this->GetArena();
  // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.Option)
  ABSL_DCHECK_NE(&from, _this);
  ::uint32_t cached_has_bits = 0;
  (void) cached_has_bits;

  if (!from._internal_name().empty()) {
    _this->_internal_set_name(from._internal_name());
  }
  cached_has_bits = from._impl_._has_bits_[0];
  if (cached_has_bits & 0x00000001u) {
    ABSL_DCHECK(from._impl_.value_ != nullptr);
    if (_this->_impl_.value_ == nullptr) {
      _this->_impl_.value_ =
          ::google::protobuf::Message::CopyConstruct<::google::protobuf::Any>(arena, *from._impl_.value_);
    } else {
      _this->_impl_.value_->MergeFrom(*from._impl_.value_);
    }
  }
  _this->_impl_._has_bits_[0] |= cached_has_bits;
  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(from._internal_metadata_);
}

void Option::CopyFrom(const Option& from) {
// @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.Option)
  if (&from == this) return;
  Clear();
  MergeFrom(from);
}


void Option::InternalSwap(Option* PROTOBUF_RESTRICT other) {
  using std::swap;
  auto* arena = GetArena();
  ABSL_DCHECK_EQ(arena, other->GetArena());
  _internal_metadata_.InternalSwap(&other->_internal_metadata_);
  swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]);
  ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.name_, &other->_impl_.name_, arena);
  swap(_impl_.value_, other->_impl_.value_);
}

::google::protobuf::Metadata Option::GetMetadata() const {
  return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full());
}
// @@protoc_insertion_point(namespace_scope)
}  // namespace protobuf
}  // namespace google
namespace google {
namespace protobuf {
}  // namespace protobuf
}  // namespace google
// @@protoc_insertion_point(global_scope)
PROTOBUF_ATTRIBUTE_INIT_PRIORITY2 static ::std::false_type
    _static_init2_ PROTOBUF_UNUSED =
        (::_pbi::AddDescriptors(&descriptor_table_google_2fprotobuf_2ftype_2eproto),
         ::std::false_type{});
#include "google/protobuf/port_undef.inc"
