// WARNING: This file is machine generated by fidlgen.

#pragma once

#include <fidl/test.protocolpayloads/cpp/markers.h>
#include <fidl/test.protocolpayloads/cpp/wire_types.h>
#include <lib/fidl/llcpp/wire_messaging.h>

#ifdef __Fuchsia__

#include <lib/fidl/llcpp/client.h>
#include <lib/fidl/llcpp/connect_service.h>
#include <lib/fidl/llcpp/server.h>
#include <lib/fidl/llcpp/service_handler_interface.h>
#include <lib/fidl/llcpp/sync_call.h>

#endif  // __Fuchsia__

#include <fidl/test.protocolpayloads.imported/cpp/wire_messaging.h>

namespace test_protocolpayloads {
class MainProtocol;

__LOCAL extern "C" const fidl_type_t
    test_protocolpayloads_imported_ImportStructPayloadTable;

__LOCAL extern "C" const fidl_type_t
    test_protocolpayloads_imported_ComposedProtocolTwoWayComposedWithErrorTopResponseTable;

__LOCAL extern "C" const fidl_type_t
    test_protocolpayloads_imported_ComposedProtocolOnComposedWithErrorRequestTable;
__LOCAL extern "C" const fidl_type_t
    test_protocolpayloads_LocalStructPayloadTable;

__LOCAL extern "C" const fidl_type_t
    test_protocolpayloads_MainProtocolTwoWayLocalWithErrorTopResponseTable;

__LOCAL extern "C" const fidl_type_t
    test_protocolpayloads_MainProtocolOnLocalWithErrorRequestTable;

__LOCAL extern "C" const fidl_type_t
    test_protocolpayloads_MainProtocolTwoWayImportWithErrorTopResponseTable;

__LOCAL extern "C" const fidl_type_t
    test_protocolpayloads_MainProtocolOnImportWithErrorRequestTable;
__LOCAL extern "C" const fidl_type_t
    test_protocolpayloads_MainProtocolOneWayAnonRequestTable;

__LOCAL extern "C" const fidl_type_t
    test_protocolpayloads_MainProtocolTwoWayAnonRequestTable;
__LOCAL extern "C" const fidl_type_t
    test_protocolpayloads_MainProtocolTwoWayAnonTopResponseTable;
__LOCAL extern "C" const fidl_type_t
    test_protocolpayloads_MainProtocolTwoWayAnonWithErrorRequestTable;
__LOCAL extern "C" const fidl_type_t
    test_protocolpayloads_MainProtocolTwoWayAnonWithErrorTopResponseTable;

__LOCAL extern "C" const fidl_type_t
    test_protocolpayloads_MainProtocolOnAnonRequestTable;

__LOCAL extern "C" const fidl_type_t
    test_protocolpayloads_MainProtocolOnAnonWithErrorRequestTable;
}  // namespace test_protocolpayloads
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocolpayloads::MainProtocol::OneWayComposed>
    final {
  static constexpr uint64_t value = 2602591870026304272lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocolpayloads::MainProtocol::TwoWayComposed>
    final {
  static constexpr uint64_t value = 2542459230546612144lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>
    final {
  static constexpr uint64_t value = 7681984876526769495lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocolpayloads::MainProtocol::OnComposed>
    final {
  static constexpr uint64_t value = 1872339328378152762lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocolpayloads::MainProtocol::OnComposedWithError>
    final {
  static constexpr uint64_t value = 7167282778061495960lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocolpayloads::MainProtocol::OneWayLocal>
    final {
  static constexpr uint64_t value = 7755175439334311701lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocolpayloads::MainProtocol::TwoWayLocal>
    final {
  static constexpr uint64_t value = 8374292137648566031lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>
    final {
  static constexpr uint64_t value = 2898559119954589948lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocolpayloads::MainProtocol::OnLocal>
    final {
  static constexpr uint64_t value = 5135782819583756313lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocolpayloads::MainProtocol::OnLocalWithError>
    final {
  static constexpr uint64_t value = 5678277415565140399lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocolpayloads::MainProtocol::OneWayImport>
    final {
  static constexpr uint64_t value = 3344777159365288972lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocolpayloads::MainProtocol::TwoWayImport>
    final {
  static constexpr uint64_t value = 2374708679656510579lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>
    final {
  static constexpr uint64_t value = 4286143084949642173lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocolpayloads::MainProtocol::OnImport>
    final {
  static constexpr uint64_t value = 1996489653379631369lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocolpayloads::MainProtocol::OnImportWithError>
    final {
  static constexpr uint64_t value = 7102941407914553861lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocolpayloads::MainProtocol::OneWayAnon>
    final {
  static constexpr uint64_t value = 811587311021806764lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocolpayloads::MainProtocol::TwoWayAnon>
    final {
  static constexpr uint64_t value = 629880979996923737lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>
    final {
  static constexpr uint64_t value = 6368863385719175734lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocolpayloads::MainProtocol::OnAnon>
    final {
  static constexpr uint64_t value = 4815229650203439104lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_protocolpayloads::MainProtocol::OnAnonWithError>
    final {
  static constexpr uint64_t value = 5024931894357412354lu;
};

namespace test_protocolpayloads {}  // namespace test_protocolpayloads
#ifdef __Fuchsia__

template <>
struct ::fidl::internal::ProtocolDetails<
    ::test_protocolpayloads::MainProtocol> {};
#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireServerDispatcher<
    ::test_protocolpayloads::MainProtocol>
    final {
  WireServerDispatcher() = delete;
  static ::fidl::DispatchResult TryDispatch(
      ::fidl::WireServer<::test_protocolpayloads::MainProtocol>* impl,
      ::fidl::IncomingMessage& msg,
      internal::IncomingTransportContext transport_context,
      ::fidl::Transaction* txn);
  static void Dispatch(
      ::fidl::WireServer<::test_protocolpayloads::MainProtocol>* impl,
      ::fidl::IncomingMessage&& msg,
      internal::IncomingTransportContext transport_context,
      ::fidl::Transaction* txn);

 private:
  static const ::fidl::internal::MethodEntry entries_[];
  static const ::fidl::internal::MethodEntry* entries_end_;
};
#endif  // __Fuchsia__

template <>
struct ::fidl::WireRequest<
    ::test_protocolpayloads::MainProtocol::OneWayComposed>
    final : public ::test_protocolpayloads_imported::wire::ImportStructPayload {
  explicit WireRequest(
      ::test_protocolpayloads_imported::wire::ImportStructPayload base)
      : ::test_protocolpayloads_imported::wire::ImportStructPayload(
            std::move(base)) {}
  explicit WireRequest(int32_t a)
      : ::test_protocolpayloads_imported::wire::ImportStructPayload{
            .a = std::move(a)} {}
  WireRequest() = default;
};

template <>
struct ::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::OneWayComposed>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::OneWayComposed>
      body;
  explicit TransactionalRequest(int32_t a)
      : body(::fidl::WireRequest<
             ::test_protocolpayloads::MainProtocol::OneWayComposed>(a)) {
    _InitHeader();
  }
  TransactionalRequest() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayComposed>
    final : public ::test_protocolpayloads_imported::wire::ImportStructPayload {
  explicit WireRequest(
      ::test_protocolpayloads_imported::wire::ImportStructPayload base)
      : ::test_protocolpayloads_imported::wire::ImportStructPayload(
            std::move(base)) {}
  explicit WireRequest(int32_t a)
      : ::test_protocolpayloads_imported::wire::ImportStructPayload{
            .a = std::move(a)} {}
  WireRequest() = default;
  using ResponseType = ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayComposed>;
};

template <>
struct ::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayComposed>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::TwoWayComposed>
      body;
  explicit TransactionalRequest(int32_t a)
      : body(::fidl::WireRequest<
             ::test_protocolpayloads::MainProtocol::TwoWayComposed>(a)) {
    _InitHeader();
  }
  TransactionalRequest() { _InitHeader(); }
  using ResponseType = ::fidl::internal::TransactionalResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayComposed>;

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayComposed>
    final : public ::test_protocolpayloads_imported::wire::ImportStructPayload {
  explicit WireResponse(
      ::test_protocolpayloads_imported::wire::ImportStructPayload base)
      : ::test_protocolpayloads_imported::wire::ImportStructPayload(
            std::move(base)) {}
  explicit WireResponse(int32_t a)
      : ::test_protocolpayloads_imported::wire::ImportStructPayload{
            .a = std::move(a)} {}
  WireResponse() = default;
};

template <>
struct ::fidl::internal::TransactionalResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayComposed>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayComposed>
      body;
  explicit TransactionalResponse(int32_t a)
      : body(::fidl::WireResponse<
             ::test_protocolpayloads::MainProtocol::TwoWayComposed>(a)) {
    _InitHeader();
  }
  TransactionalResponse() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>
    final : public ::test_protocolpayloads_imported::wire::ImportStructPayload {
  explicit WireRequest(
      ::test_protocolpayloads_imported::wire::ImportStructPayload base)
      : ::test_protocolpayloads_imported::wire::ImportStructPayload(
            std::move(base)) {}
  explicit WireRequest(int32_t a)
      : ::test_protocolpayloads_imported::wire::ImportStructPayload{
            .a = std::move(a)} {}
  WireRequest() = default;
  using ResponseType = ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>;
};

template <>
struct ::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireRequest<
      ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>
      body;
  explicit TransactionalRequest(int32_t a)
      : body(::fidl::WireRequest<
             ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>(
            a)) {
    _InitHeader();
  }
  TransactionalRequest() { _InitHeader(); }
  using ResponseType = ::fidl::internal::TransactionalResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>;

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>
    final : public ::test_protocolpayloads_imported::wire::
                ComposedProtocolTwoWayComposedWithErrorTopResponse {
  explicit WireResponse(
      ::test_protocolpayloads_imported::wire::
          ComposedProtocolTwoWayComposedWithErrorTopResponse base)
      : ::test_protocolpayloads_imported::wire::
            ComposedProtocolTwoWayComposedWithErrorTopResponse(
                std::move(base)) {}
  explicit WireResponse(
      ::test_protocolpayloads_imported::wire::
          ComposedProtocolTwoWayComposedWithErrorResult result)
      : ::test_protocolpayloads_imported::wire::
            ComposedProtocolTwoWayComposedWithErrorTopResponse{
                .result = std::move(result)} {}
  WireResponse() = default;
};

template <>
struct ::fidl::internal::TransactionalResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>
      body;
  explicit TransactionalResponse(
      ::test_protocolpayloads_imported::wire::
          ComposedProtocolTwoWayComposedWithErrorResult result)
      : body(::fidl::WireResponse<
             ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>(
            result)) {
    _InitHeader();
  }
  TransactionalResponse() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnComposed>
    final : public ::test_protocolpayloads_imported::wire::ImportStructPayload {
  explicit WireEvent(
      ::test_protocolpayloads_imported::wire::ImportStructPayload base)
      : ::test_protocolpayloads_imported::wire::ImportStructPayload(
            std::move(base)) {}
  explicit WireEvent(int32_t a)
      : ::test_protocolpayloads_imported::wire::ImportStructPayload{
            .a = std::move(a)} {}
  WireEvent() = default;
};

template <>
struct ::fidl::internal::TransactionalEvent<
    ::test_protocolpayloads::MainProtocol::OnComposed>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnComposed> body;
  explicit TransactionalEvent(int32_t a)
      : body(::fidl::WireEvent<
             ::test_protocolpayloads::MainProtocol::OnComposed>(a)) {
    _InitHeader();
  }
  TransactionalEvent() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireEvent<
    ::test_protocolpayloads::MainProtocol::OnComposedWithError>
    final : public ::test_protocolpayloads_imported::wire::
                ComposedProtocolOnComposedWithErrorRequest {
  explicit WireEvent(::test_protocolpayloads_imported::wire::
                         ComposedProtocolOnComposedWithErrorRequest base)
      : ::test_protocolpayloads_imported::wire::
            ComposedProtocolOnComposedWithErrorRequest(std::move(base)) {}
  explicit WireEvent(::test_protocolpayloads_imported::wire::
                         ComposedProtocolOnComposedWithErrorResult result)
      : ::test_protocolpayloads_imported::wire::
            ComposedProtocolOnComposedWithErrorRequest{.result =
                                                           std::move(result)} {}
  WireEvent() = default;
};

template <>
struct ::fidl::internal::TransactionalEvent<
    ::test_protocolpayloads::MainProtocol::OnComposedWithError>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnComposedWithError>
      body;
  explicit TransactionalEvent(
      ::test_protocolpayloads_imported::wire::
          ComposedProtocolOnComposedWithErrorResult result)
      : body(::fidl::WireEvent<
             ::test_protocolpayloads::MainProtocol::OnComposedWithError>(
            result)) {
    _InitHeader();
  }
  TransactionalEvent() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::OneWayLocal>
    final : public ::test_protocolpayloads::wire::LocalStructPayload {
  explicit WireRequest(::test_protocolpayloads::wire::LocalStructPayload base)
      : ::test_protocolpayloads::wire::LocalStructPayload(std::move(base)) {}
  explicit WireRequest(uint32_t a, uint32_t b)
      : ::test_protocolpayloads::wire::LocalStructPayload{.a = std::move(a),
                                                          .b = std::move(b)} {}
  WireRequest() = default;
};

template <>
struct ::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::OneWayLocal>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::OneWayLocal> body;
  explicit TransactionalRequest(uint32_t a, uint32_t b)
      : body(::fidl::WireRequest<
             ::test_protocolpayloads::MainProtocol::OneWayLocal>(a, b)) {
    _InitHeader();
  }
  TransactionalRequest() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::TwoWayLocal>
    final : public ::test_protocolpayloads::wire::LocalStructPayload {
  explicit WireRequest(::test_protocolpayloads::wire::LocalStructPayload base)
      : ::test_protocolpayloads::wire::LocalStructPayload(std::move(base)) {}
  explicit WireRequest(uint32_t a, uint32_t b)
      : ::test_protocolpayloads::wire::LocalStructPayload{.a = std::move(a),
                                                          .b = std::move(b)} {}
  WireRequest() = default;
  using ResponseType =
      ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayLocal>;
};

template <>
struct ::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayLocal>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::TwoWayLocal> body;
  explicit TransactionalRequest(uint32_t a, uint32_t b)
      : body(::fidl::WireRequest<
             ::test_protocolpayloads::MainProtocol::TwoWayLocal>(a, b)) {
    _InitHeader();
  }
  TransactionalRequest() { _InitHeader(); }
  using ResponseType = ::fidl::internal::TransactionalResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayLocal>;

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayLocal>
    final : public ::test_protocolpayloads::wire::LocalStructPayload {
  explicit WireResponse(::test_protocolpayloads::wire::LocalStructPayload base)
      : ::test_protocolpayloads::wire::LocalStructPayload(std::move(base)) {}
  explicit WireResponse(uint32_t a, uint32_t b)
      : ::test_protocolpayloads::wire::LocalStructPayload{.a = std::move(a),
                                                          .b = std::move(b)} {}
  WireResponse() = default;
};

template <>
struct ::fidl::internal::TransactionalResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayLocal>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayLocal> body;
  explicit TransactionalResponse(uint32_t a, uint32_t b)
      : body(::fidl::WireResponse<
             ::test_protocolpayloads::MainProtocol::TwoWayLocal>(a, b)) {
    _InitHeader();
  }
  TransactionalResponse() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>
    final : public ::test_protocolpayloads::wire::LocalStructPayload {
  explicit WireRequest(::test_protocolpayloads::wire::LocalStructPayload base)
      : ::test_protocolpayloads::wire::LocalStructPayload(std::move(base)) {}
  explicit WireRequest(uint32_t a, uint32_t b)
      : ::test_protocolpayloads::wire::LocalStructPayload{.a = std::move(a),
                                                          .b = std::move(b)} {}
  WireRequest() = default;
  using ResponseType = ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>;
};

template <>
struct ::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireRequest<
      ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>
      body;
  explicit TransactionalRequest(uint32_t a, uint32_t b)
      : body(::fidl::WireRequest<
             ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>(a,
                                                                          b)) {
    _InitHeader();
  }
  TransactionalRequest() { _InitHeader(); }
  using ResponseType = ::fidl::internal::TransactionalResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>;

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>
    final : public ::test_protocolpayloads::wire::
                MainProtocolTwoWayLocalWithErrorTopResponse {
  using Result =
      test_protocolpayloads::wire::MainProtocolTwoWayLocalWithErrorResult;

  explicit WireResponse(
      ::test_protocolpayloads::wire::MainProtocolTwoWayLocalWithErrorTopResponse
          base)
      : ::test_protocolpayloads::wire::
            MainProtocolTwoWayLocalWithErrorTopResponse(std::move(base)) {}
  explicit WireResponse(
      ::test_protocolpayloads::wire::MainProtocolTwoWayLocalWithErrorResult
          result)
      : ::test_protocolpayloads::wire::
            MainProtocolTwoWayLocalWithErrorTopResponse{.result =
                                                            std::move(result)} {
  }
  WireResponse() = default;
};

template <>
struct ::fidl::internal::TransactionalResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>
      body;
  explicit TransactionalResponse(
      ::test_protocolpayloads::wire::MainProtocolTwoWayLocalWithErrorResult
          result)
      : body(::fidl::WireResponse<
             ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>(
            result)) {
    _InitHeader();
  }
  TransactionalResponse() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnLocal> final
    : public ::test_protocolpayloads::wire::LocalStructPayload {
  explicit WireEvent(::test_protocolpayloads::wire::LocalStructPayload base)
      : ::test_protocolpayloads::wire::LocalStructPayload(std::move(base)) {}
  explicit WireEvent(uint32_t a, uint32_t b)
      : ::test_protocolpayloads::wire::LocalStructPayload{.a = std::move(a),
                                                          .b = std::move(b)} {}
  WireEvent() = default;
};

template <>
struct ::fidl::internal::TransactionalEvent<
    ::test_protocolpayloads::MainProtocol::OnLocal>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnLocal> body;
  explicit TransactionalEvent(uint32_t a, uint32_t b)
      : body(::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnLocal>(
            a, b)) {
    _InitHeader();
  }
  TransactionalEvent() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireEvent<
    ::test_protocolpayloads::MainProtocol::OnLocalWithError>
    final : public ::test_protocolpayloads::wire::
                MainProtocolOnLocalWithErrorRequest {
  using Result =
      test_protocolpayloads::wire::MainProtocolOnLocalWithErrorResult;

  explicit WireEvent(
      ::test_protocolpayloads::wire::MainProtocolOnLocalWithErrorRequest base)
      : ::test_protocolpayloads::wire::MainProtocolOnLocalWithErrorRequest(
            std::move(base)) {}
  explicit WireEvent(
      ::test_protocolpayloads::wire::MainProtocolOnLocalWithErrorResult result)
      : ::test_protocolpayloads::wire::MainProtocolOnLocalWithErrorRequest{
            .result = std::move(result)} {}
  WireEvent() = default;
};

template <>
struct ::fidl::internal::TransactionalEvent<
    ::test_protocolpayloads::MainProtocol::OnLocalWithError>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnLocalWithError>
      body;
  explicit TransactionalEvent(
      ::test_protocolpayloads::wire::MainProtocolOnLocalWithErrorResult result)
      : body(::fidl::WireEvent<
             ::test_protocolpayloads::MainProtocol::OnLocalWithError>(result)) {
    _InitHeader();
  }
  TransactionalEvent() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::OneWayImport>
    final : public ::test_protocolpayloads_imported::wire::ImportStructPayload {
  explicit WireRequest(
      ::test_protocolpayloads_imported::wire::ImportStructPayload base)
      : ::test_protocolpayloads_imported::wire::ImportStructPayload(
            std::move(base)) {}
  explicit WireRequest(int32_t a)
      : ::test_protocolpayloads_imported::wire::ImportStructPayload{
            .a = std::move(a)} {}
  WireRequest() = default;
};

template <>
struct ::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::OneWayImport>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::OneWayImport> body;
  explicit TransactionalRequest(int32_t a)
      : body(::fidl::WireRequest<
             ::test_protocolpayloads::MainProtocol::OneWayImport>(a)) {
    _InitHeader();
  }
  TransactionalRequest() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::TwoWayImport>
    final : public ::test_protocolpayloads_imported::wire::ImportStructPayload {
  explicit WireRequest(
      ::test_protocolpayloads_imported::wire::ImportStructPayload base)
      : ::test_protocolpayloads_imported::wire::ImportStructPayload(
            std::move(base)) {}
  explicit WireRequest(int32_t a)
      : ::test_protocolpayloads_imported::wire::ImportStructPayload{
            .a = std::move(a)} {}
  WireRequest() = default;
  using ResponseType =
      ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayImport>;
};

template <>
struct ::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayImport>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::TwoWayImport> body;
  explicit TransactionalRequest(int32_t a)
      : body(::fidl::WireRequest<
             ::test_protocolpayloads::MainProtocol::TwoWayImport>(a)) {
    _InitHeader();
  }
  TransactionalRequest() { _InitHeader(); }
  using ResponseType = ::fidl::internal::TransactionalResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayImport>;

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayImport>
    final : public ::test_protocolpayloads_imported::wire::ImportStructPayload {
  explicit WireResponse(
      ::test_protocolpayloads_imported::wire::ImportStructPayload base)
      : ::test_protocolpayloads_imported::wire::ImportStructPayload(
            std::move(base)) {}
  explicit WireResponse(int32_t a)
      : ::test_protocolpayloads_imported::wire::ImportStructPayload{
            .a = std::move(a)} {}
  WireResponse() = default;
};

template <>
struct ::fidl::internal::TransactionalResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayImport>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayImport>
      body;
  explicit TransactionalResponse(int32_t a)
      : body(::fidl::WireResponse<
             ::test_protocolpayloads::MainProtocol::TwoWayImport>(a)) {
    _InitHeader();
  }
  TransactionalResponse() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>
    final : public ::test_protocolpayloads_imported::wire::ImportStructPayload {
  explicit WireRequest(
      ::test_protocolpayloads_imported::wire::ImportStructPayload base)
      : ::test_protocolpayloads_imported::wire::ImportStructPayload(
            std::move(base)) {}
  explicit WireRequest(int32_t a)
      : ::test_protocolpayloads_imported::wire::ImportStructPayload{
            .a = std::move(a)} {}
  WireRequest() = default;
  using ResponseType = ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>;
};

template <>
struct ::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireRequest<
      ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>
      body;
  explicit TransactionalRequest(int32_t a)
      : body(::fidl::WireRequest<
             ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>(a)) {
    _InitHeader();
  }
  TransactionalRequest() { _InitHeader(); }
  using ResponseType = ::fidl::internal::TransactionalResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>;

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>
    final : public ::test_protocolpayloads::wire::
                MainProtocolTwoWayImportWithErrorTopResponse {
  using Result =
      test_protocolpayloads::wire::MainProtocolTwoWayImportWithErrorResult;

  explicit WireResponse(::test_protocolpayloads::wire::
                            MainProtocolTwoWayImportWithErrorTopResponse base)
      : ::test_protocolpayloads::wire::
            MainProtocolTwoWayImportWithErrorTopResponse(std::move(base)) {}
  explicit WireResponse(
      ::test_protocolpayloads::wire::MainProtocolTwoWayImportWithErrorResult
          result)
      : ::test_protocolpayloads::wire::
            MainProtocolTwoWayImportWithErrorTopResponse{
                .result = std::move(result)} {}
  WireResponse() = default;
};

template <>
struct ::fidl::internal::TransactionalResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>
      body;
  explicit TransactionalResponse(
      ::test_protocolpayloads::wire::MainProtocolTwoWayImportWithErrorResult
          result)
      : body(::fidl::WireResponse<
             ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>(
            result)) {
    _InitHeader();
  }
  TransactionalResponse() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnImport> final
    : public ::test_protocolpayloads_imported::wire::ImportStructPayload {
  explicit WireEvent(
      ::test_protocolpayloads_imported::wire::ImportStructPayload base)
      : ::test_protocolpayloads_imported::wire::ImportStructPayload(
            std::move(base)) {}
  explicit WireEvent(int32_t a)
      : ::test_protocolpayloads_imported::wire::ImportStructPayload{
            .a = std::move(a)} {}
  WireEvent() = default;
};

template <>
struct ::fidl::internal::TransactionalEvent<
    ::test_protocolpayloads::MainProtocol::OnImport>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnImport> body;
  explicit TransactionalEvent(int32_t a)
      : body(::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnImport>(
            a)) {
    _InitHeader();
  }
  TransactionalEvent() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireEvent<
    ::test_protocolpayloads::MainProtocol::OnImportWithError>
    final : public ::test_protocolpayloads::wire::
                MainProtocolOnImportWithErrorRequest {
  using Result =
      test_protocolpayloads::wire::MainProtocolOnImportWithErrorResult;

  explicit WireEvent(
      ::test_protocolpayloads::wire::MainProtocolOnImportWithErrorRequest base)
      : ::test_protocolpayloads::wire::MainProtocolOnImportWithErrorRequest(
            std::move(base)) {}
  explicit WireEvent(
      ::test_protocolpayloads::wire::MainProtocolOnImportWithErrorResult result)
      : ::test_protocolpayloads::wire::MainProtocolOnImportWithErrorRequest{
            .result = std::move(result)} {}
  WireEvent() = default;
};

template <>
struct ::fidl::internal::TransactionalEvent<
    ::test_protocolpayloads::MainProtocol::OnImportWithError>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnImportWithError>
      body;
  explicit TransactionalEvent(
      ::test_protocolpayloads::wire::MainProtocolOnImportWithErrorResult result)
      : body(::fidl::WireEvent<
             ::test_protocolpayloads::MainProtocol::OnImportWithError>(
            result)) {
    _InitHeader();
  }
  TransactionalEvent() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::OneWayAnon>
    final
    : public ::test_protocolpayloads::wire::MainProtocolOneWayAnonRequest {
  explicit WireRequest(
      ::test_protocolpayloads::wire::MainProtocolOneWayAnonRequest base)
      : ::test_protocolpayloads::wire::MainProtocolOneWayAnonRequest(
            std::move(base)) {}
  explicit WireRequest(uint32_t a, uint32_t b)
      : ::test_protocolpayloads::wire::MainProtocolOneWayAnonRequest{
            .a = std::move(a), .b = std::move(b)} {}
  WireRequest() = default;
};

template <>
struct ::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::OneWayAnon>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::OneWayAnon> body;
  explicit TransactionalRequest(uint32_t a, uint32_t b)
      : body(::fidl::WireRequest<
             ::test_protocolpayloads::MainProtocol::OneWayAnon>(a, b)) {
    _InitHeader();
  }
  TransactionalRequest() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::TwoWayAnon>
    final
    : public ::test_protocolpayloads::wire::MainProtocolTwoWayAnonRequest {
  explicit WireRequest(
      ::test_protocolpayloads::wire::MainProtocolTwoWayAnonRequest base)
      : ::test_protocolpayloads::wire::MainProtocolTwoWayAnonRequest(
            std::move(base)) {}
  explicit WireRequest(uint32_t a, uint32_t b)
      : ::test_protocolpayloads::wire::MainProtocolTwoWayAnonRequest{
            .a = std::move(a), .b = std::move(b)} {}
  WireRequest() = default;
  using ResponseType =
      ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayAnon>;
};

template <>
struct ::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayAnon>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::TwoWayAnon> body;
  explicit TransactionalRequest(uint32_t a, uint32_t b)
      : body(::fidl::WireRequest<
             ::test_protocolpayloads::MainProtocol::TwoWayAnon>(a, b)) {
    _InitHeader();
  }
  TransactionalRequest() { _InitHeader(); }
  using ResponseType = ::fidl::internal::TransactionalResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayAnon>;

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayAnon>
    final
    : public ::test_protocolpayloads::wire::MainProtocolTwoWayAnonTopResponse {
  explicit WireResponse(
      ::test_protocolpayloads::wire::MainProtocolTwoWayAnonTopResponse base)
      : ::test_protocolpayloads::wire::MainProtocolTwoWayAnonTopResponse(
            std::move(base)) {}
  explicit WireResponse(uint32_t a, uint32_t b)
      : ::test_protocolpayloads::wire::MainProtocolTwoWayAnonTopResponse{
            .a = std::move(a), .b = std::move(b)} {}
  WireResponse() = default;
};

template <>
struct ::fidl::internal::TransactionalResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayAnon>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayAnon> body;
  explicit TransactionalResponse(uint32_t a, uint32_t b)
      : body(::fidl::WireResponse<
             ::test_protocolpayloads::MainProtocol::TwoWayAnon>(a, b)) {
    _InitHeader();
  }
  TransactionalResponse() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>
    final : public ::test_protocolpayloads::wire::
                MainProtocolTwoWayAnonWithErrorRequest {
  explicit WireRequest(
      ::test_protocolpayloads::wire::MainProtocolTwoWayAnonWithErrorRequest
          base)
      : ::test_protocolpayloads::wire::MainProtocolTwoWayAnonWithErrorRequest(
            std::move(base)) {}
  explicit WireRequest(uint32_t a, uint32_t b)
      : ::test_protocolpayloads::wire::MainProtocolTwoWayAnonWithErrorRequest{
            .a = std::move(a), .b = std::move(b)} {}
  WireRequest() = default;
  using ResponseType = ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>;
};

template <>
struct ::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireRequest<
      ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>
      body;
  explicit TransactionalRequest(uint32_t a, uint32_t b)
      : body(::fidl::WireRequest<
             ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>(a,
                                                                         b)) {
    _InitHeader();
  }
  TransactionalRequest() { _InitHeader(); }
  using ResponseType = ::fidl::internal::TransactionalResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>;

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>
    final : public ::test_protocolpayloads::wire::
                MainProtocolTwoWayAnonWithErrorTopResponse {
  using Result =
      test_protocolpayloads::wire::MainProtocolTwoWayAnonWithErrorResult;

  explicit WireResponse(
      ::test_protocolpayloads::wire::MainProtocolTwoWayAnonWithErrorTopResponse
          base)
      : ::test_protocolpayloads::wire::
            MainProtocolTwoWayAnonWithErrorTopResponse(std::move(base)) {}
  explicit WireResponse(
      ::test_protocolpayloads::wire::MainProtocolTwoWayAnonWithErrorResult
          result)
      : ::test_protocolpayloads::wire::
            MainProtocolTwoWayAnonWithErrorTopResponse{.result =
                                                           std::move(result)} {}
  WireResponse() = default;
};

template <>
struct ::fidl::internal::TransactionalResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>
      body;
  explicit TransactionalResponse(
      ::test_protocolpayloads::wire::MainProtocolTwoWayAnonWithErrorResult
          result)
      : body(::fidl::WireResponse<
             ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>(
            result)) {
    _InitHeader();
  }
  TransactionalResponse() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnAnon> final
    : public ::test_protocolpayloads::wire::MainProtocolOnAnonRequest {
  explicit WireEvent(
      ::test_protocolpayloads::wire::MainProtocolOnAnonRequest base)
      : ::test_protocolpayloads::wire::MainProtocolOnAnonRequest(
            std::move(base)) {}
  explicit WireEvent(uint32_t a, uint32_t b)
      : ::test_protocolpayloads::wire::MainProtocolOnAnonRequest{
            .a = std::move(a), .b = std::move(b)} {}
  WireEvent() = default;
};

template <>
struct ::fidl::internal::TransactionalEvent<
    ::test_protocolpayloads::MainProtocol::OnAnon>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnAnon> body;
  explicit TransactionalEvent(uint32_t a, uint32_t b)
      : body(::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnAnon>(
            a, b)) {
    _InitHeader();
  }
  TransactionalEvent() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnAnonWithError>
    final
    : public ::test_protocolpayloads::wire::MainProtocolOnAnonWithErrorRequest {
  using Result = test_protocolpayloads::wire::MainProtocolOnAnonWithErrorResult;

  explicit WireEvent(
      ::test_protocolpayloads::wire::MainProtocolOnAnonWithErrorRequest base)
      : ::test_protocolpayloads::wire::MainProtocolOnAnonWithErrorRequest(
            std::move(base)) {}
  explicit WireEvent(
      ::test_protocolpayloads::wire::MainProtocolOnAnonWithErrorResult result)
      : ::test_protocolpayloads::wire::MainProtocolOnAnonWithErrorRequest{
            .result = std::move(result)} {}
  WireEvent() = default;
};

template <>
struct ::fidl::internal::TransactionalEvent<
    ::test_protocolpayloads::MainProtocol::OnAnonWithError>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnAnonWithError>
      body;
  explicit TransactionalEvent(
      ::test_protocolpayloads::wire::MainProtocolOnAnonWithErrorResult result)
      : body(::fidl::WireEvent<
             ::test_protocolpayloads::MainProtocol::OnAnonWithError>(result)) {
    _InitHeader();
  }
  TransactionalEvent() { _InitHeader(); }

 private:
  void _InitHeader();
};

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireMethodTypes<
    ::test_protocolpayloads::MainProtocol::TwoWayComposed> {
  using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<
      ::test_protocolpayloads::MainProtocol::TwoWayComposed>>;

  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_protocolpayloads::MainProtocol::TwoWayComposed,
      ::fidl::unstable::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_protocolpayloads::MainProtocol::TwoWayComposed>,
          ::fidl::internal::ChannelTransport>>;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_protocolpayloads::MainProtocol::TwoWayComposed,
      ::fidl::unstable::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_protocolpayloads::MainProtocol::TwoWayComposed>,
          ::fidl::internal::ChannelTransport>>;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireMethodTypes<
    ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError> {
  using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<
      ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>>;

  using ApplicationError = uint32_t;

  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError,
      ::fidl::unstable::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>,
          ::fidl::internal::ChannelTransport>>;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError,
      ::fidl::unstable::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>,
          ::fidl::internal::ChannelTransport>>;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireMethodTypes<
    ::test_protocolpayloads::MainProtocol::TwoWayLocal> {
  using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<
      ::test_protocolpayloads::MainProtocol::TwoWayLocal>>;

  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_protocolpayloads::MainProtocol::TwoWayLocal,
      ::fidl::unstable::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_protocolpayloads::MainProtocol::TwoWayLocal>,
          ::fidl::internal::ChannelTransport>>;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_protocolpayloads::MainProtocol::TwoWayLocal,
      ::fidl::unstable::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_protocolpayloads::MainProtocol::TwoWayLocal>,
          ::fidl::internal::ChannelTransport>>;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireMethodTypes<
    ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError> {
  using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<
      ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>>;

  using ApplicationError = uint32_t;

  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError,
      ::fidl::unstable::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>,
          ::fidl::internal::ChannelTransport>>;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError,
      ::fidl::unstable::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>,
          ::fidl::internal::ChannelTransport>>;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireMethodTypes<
    ::test_protocolpayloads::MainProtocol::TwoWayImport> {
  using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<
      ::test_protocolpayloads::MainProtocol::TwoWayImport>>;

  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_protocolpayloads::MainProtocol::TwoWayImport,
      ::fidl::unstable::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_protocolpayloads::MainProtocol::TwoWayImport>,
          ::fidl::internal::ChannelTransport>>;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_protocolpayloads::MainProtocol::TwoWayImport,
      ::fidl::unstable::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_protocolpayloads::MainProtocol::TwoWayImport>,
          ::fidl::internal::ChannelTransport>>;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireMethodTypes<
    ::test_protocolpayloads::MainProtocol::TwoWayImportWithError> {
  using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<
      ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>>;

  using ApplicationError = uint32_t;

  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_protocolpayloads::MainProtocol::TwoWayImportWithError,
      ::fidl::unstable::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>,
          ::fidl::internal::ChannelTransport>>;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_protocolpayloads::MainProtocol::TwoWayImportWithError,
      ::fidl::unstable::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>,
          ::fidl::internal::ChannelTransport>>;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireMethodTypes<
    ::test_protocolpayloads::MainProtocol::TwoWayAnon> {
  using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<
      ::test_protocolpayloads::MainProtocol::TwoWayAnon>>;

  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_protocolpayloads::MainProtocol::TwoWayAnon,
      ::fidl::unstable::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_protocolpayloads::MainProtocol::TwoWayAnon>,
          ::fidl::internal::ChannelTransport>>;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_protocolpayloads::MainProtocol::TwoWayAnon,
      ::fidl::unstable::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_protocolpayloads::MainProtocol::TwoWayAnon>,
          ::fidl::internal::ChannelTransport>>;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireMethodTypes<
    ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError> {
  using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<
      ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>>;

  using ApplicationError = uint32_t;

  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError,
      ::fidl::unstable::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>,
          ::fidl::internal::ChannelTransport>>;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError,
      ::fidl::unstable::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>,
          ::fidl::internal::ChannelTransport>>;
};

#endif  // __Fuchsia__

namespace fidl {

template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::OneWayComposed>>
    : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::OneWayComposed>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::OneWayComposed>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::OneWayComposed>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::OneWayComposed>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_imported_ImportStructPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(4 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(4 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(
    sizeof(::fidl::internal::TransactionalRequest<
           ::test_protocolpayloads::MainProtocol::OneWayComposed>) ==
    TypeTraits<::fidl::internal::TransactionalRequest<
        ::test_protocolpayloads::MainProtocol::OneWayComposed>>::kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalRequest<
                 ::test_protocolpayloads::MainProtocol::OneWayComposed>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalRequest<
                 ::test_protocolpayloads::MainProtocol::OneWayComposed>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireRequest<
    ::test_protocolpayloads::MainProtocol::OneWayComposed>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_imported_ImportStructPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 4;
  static constexpr uint32_t kPrimarySizeV1 = 4;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};
static_assert(
    sizeof(::fidl::WireRequest<
           ::test_protocolpayloads::MainProtocol::OneWayComposed>) ==
    TypeTraits<::fidl::WireRequest<
        ::test_protocolpayloads::MainProtocol::OneWayComposed>>::kPrimarySize);
static_assert(
    offsetof(::fidl::WireRequest<
                 ::test_protocolpayloads::MainProtocol::OneWayComposed>,
             a) == 0);

template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayComposed>>
    : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::TwoWayComposed>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayComposed>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::TwoWayComposed>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayComposed>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_imported_ImportStructPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(4 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(4 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(
    sizeof(::fidl::internal::TransactionalRequest<
           ::test_protocolpayloads::MainProtocol::TwoWayComposed>) ==
    TypeTraits<::fidl::internal::TransactionalRequest<
        ::test_protocolpayloads::MainProtocol::TwoWayComposed>>::kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalRequest<
                 ::test_protocolpayloads::MainProtocol::TwoWayComposed>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalRequest<
                 ::test_protocolpayloads::MainProtocol::TwoWayComposed>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayComposed>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_imported_ImportStructPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 4;
  static constexpr uint32_t kPrimarySizeV1 = 4;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};
static_assert(
    sizeof(::fidl::WireRequest<
           ::test_protocolpayloads::MainProtocol::TwoWayComposed>) ==
    TypeTraits<::fidl::WireRequest<
        ::test_protocolpayloads::MainProtocol::TwoWayComposed>>::kPrimarySize);
static_assert(
    offsetof(::fidl::WireRequest<
                 ::test_protocolpayloads::MainProtocol::TwoWayComposed>,
             a) == 0);

template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayComposed>>
    : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayComposed>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayComposed>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayComposed>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayComposed>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_imported_ImportStructPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(4 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(4 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalResponse<
           ::test_protocolpayloads::MainProtocol::TwoWayComposed>) ==
    TypeTraits<::fidl::internal::TransactionalResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayComposed>>::kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalResponse<
                 ::test_protocolpayloads::MainProtocol::TwoWayComposed>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalResponse<
                 ::test_protocolpayloads::MainProtocol::TwoWayComposed>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayComposed>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_imported_ImportStructPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 4;
  static constexpr uint32_t kPrimarySizeV1 = 4;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireResponse<
           ::test_protocolpayloads::MainProtocol::TwoWayComposed>) ==
    TypeTraits<::fidl::WireResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayComposed>>::kPrimarySize);
static_assert(
    offsetof(::fidl::WireResponse<
                 ::test_protocolpayloads::MainProtocol::TwoWayComposed>,
             a) == 0);

template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::WireRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_imported_ImportStructPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(4 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(4 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(
    sizeof(::fidl::internal::TransactionalRequest<
           ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>) ==
    TypeTraits<::fidl::internal::TransactionalRequest<
        ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>>::
        kPrimarySize);
static_assert(
    offsetof(
        ::fidl::internal::TransactionalRequest<
            ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>,
        header) == 0);
static_assert(
    offsetof(
        ::fidl::internal::TransactionalRequest<
            ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>,
        body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_imported_ImportStructPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 4;
  static constexpr uint32_t kPrimarySizeV1 = 4;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};
static_assert(
    sizeof(::fidl::WireRequest<
           ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>) ==
    TypeTraits<::fidl::WireRequest<::test_protocolpayloads::MainProtocol::
                                       TwoWayComposedWithError>>::kPrimarySize);
static_assert(
    offsetof(
        ::fidl::WireRequest<
            ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>,
        a) == 0);

template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::WireResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_imported_ComposedProtocolTwoWayComposedWithErrorTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(24 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalResponse<
           ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>) ==
    TypeTraits<::fidl::internal::TransactionalResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>>::
        kPrimarySize);
static_assert(
    offsetof(
        ::fidl::internal::TransactionalResponse<
            ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>,
        header) == 0);
static_assert(
    offsetof(
        ::fidl::internal::TransactionalResponse<
            ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>,
        body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_imported_ComposedProtocolTwoWayComposedWithErrorTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireResponse<
           ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>) ==
    TypeTraits<::fidl::WireResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>>::
        kPrimarySize);
static_assert(
    offsetof(
        ::fidl::WireResponse<
            ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>,
        result) == 0);

template <>
struct IsFidlType<::fidl::internal::TransactionalEvent<
    ::test_protocolpayloads::MainProtocol::OnComposed>>
    : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnComposed>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalEvent<
    ::test_protocolpayloads::MainProtocol::OnComposed>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnComposed>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalEvent<
    ::test_protocolpayloads::MainProtocol::OnComposed>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_imported_ImportStructPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(4 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(4 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalEvent<
           ::test_protocolpayloads::MainProtocol::OnComposed>) ==
    TypeTraits<::fidl::internal::TransactionalEvent<
        ::test_protocolpayloads::MainProtocol::OnComposed>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalEvent<
                           ::test_protocolpayloads::MainProtocol::OnComposed>,
                       header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalEvent<
                           ::test_protocolpayloads::MainProtocol::OnComposed>,
                       body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<
    ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnComposed>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_imported_ImportStructPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 4;
  static constexpr uint32_t kPrimarySizeV1 = 4;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(
        ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnComposed>) ==
    TypeTraits<::fidl::WireEvent<
        ::test_protocolpayloads::MainProtocol::OnComposed>>::kPrimarySize);
static_assert(
    offsetof(
        ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnComposed>,
        a) == 0);

template <>
struct IsFidlType<::fidl::internal::TransactionalEvent<
    ::test_protocolpayloads::MainProtocol::OnComposedWithError>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireEvent<
    ::test_protocolpayloads::MainProtocol::OnComposedWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalEvent<
    ::test_protocolpayloads::MainProtocol::OnComposedWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::WireEvent<
    ::test_protocolpayloads::MainProtocol::OnComposedWithError>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalEvent<
    ::test_protocolpayloads::MainProtocol::OnComposedWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_imported_ComposedProtocolOnComposedWithErrorRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(24 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalEvent<
           ::test_protocolpayloads::MainProtocol::OnComposedWithError>) ==
    TypeTraits<::fidl::internal::TransactionalEvent<
        ::test_protocolpayloads::MainProtocol::OnComposedWithError>>::
        kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalEvent<
                 ::test_protocolpayloads::MainProtocol::OnComposedWithError>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalEvent<
                 ::test_protocolpayloads::MainProtocol::OnComposedWithError>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireEvent<
    ::test_protocolpayloads::MainProtocol::OnComposedWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_imported_ComposedProtocolOnComposedWithErrorRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireEvent<
           ::test_protocolpayloads::MainProtocol::OnComposedWithError>) ==
    TypeTraits<::fidl::WireEvent<::test_protocolpayloads::MainProtocol::
                                     OnComposedWithError>>::kPrimarySize);
static_assert(
    offsetof(::fidl::WireEvent<
                 ::test_protocolpayloads::MainProtocol::OnComposedWithError>,
             result) == 0);

template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::OneWayLocal>>
    : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::OneWayLocal>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::OneWayLocal>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::OneWayLocal>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::OneWayLocal>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::test_protocolpayloads_LocalStructPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(8 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(8 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(
    sizeof(::fidl::internal::TransactionalRequest<
           ::test_protocolpayloads::MainProtocol::OneWayLocal>) ==
    TypeTraits<::fidl::internal::TransactionalRequest<
        ::test_protocolpayloads::MainProtocol::OneWayLocal>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<
                           ::test_protocolpayloads::MainProtocol::OneWayLocal>,
                       header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<
                           ::test_protocolpayloads::MainProtocol::OneWayLocal>,
                       body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<
    ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::OneWayLocal>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::test_protocolpayloads_LocalStructPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 8;
  static constexpr uint32_t kPrimarySizeV1 = 8;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};
static_assert(
    sizeof(::fidl::WireRequest<
           ::test_protocolpayloads::MainProtocol::OneWayLocal>) ==
    TypeTraits<::fidl::WireRequest<
        ::test_protocolpayloads::MainProtocol::OneWayLocal>>::kPrimarySize);
static_assert(
    offsetof(
        ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::OneWayLocal>,
        a) == 0);
static_assert(
    offsetof(
        ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::OneWayLocal>,
        b) == 4);

template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayLocal>>
    : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::TwoWayLocal>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayLocal>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::TwoWayLocal>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayLocal>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::test_protocolpayloads_LocalStructPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(8 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(8 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(
    sizeof(::fidl::internal::TransactionalRequest<
           ::test_protocolpayloads::MainProtocol::TwoWayLocal>) ==
    TypeTraits<::fidl::internal::TransactionalRequest<
        ::test_protocolpayloads::MainProtocol::TwoWayLocal>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<
                           ::test_protocolpayloads::MainProtocol::TwoWayLocal>,
                       header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<
                           ::test_protocolpayloads::MainProtocol::TwoWayLocal>,
                       body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<
    ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::TwoWayLocal>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::test_protocolpayloads_LocalStructPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 8;
  static constexpr uint32_t kPrimarySizeV1 = 8;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};
static_assert(
    sizeof(::fidl::WireRequest<
           ::test_protocolpayloads::MainProtocol::TwoWayLocal>) ==
    TypeTraits<::fidl::WireRequest<
        ::test_protocolpayloads::MainProtocol::TwoWayLocal>>::kPrimarySize);
static_assert(
    offsetof(
        ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::TwoWayLocal>,
        a) == 0);
static_assert(
    offsetof(
        ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::TwoWayLocal>,
        b) == 4);

template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayLocal>>
    : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayLocal>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayLocal>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayLocal>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayLocal>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::test_protocolpayloads_LocalStructPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(8 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(8 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalResponse<
           ::test_protocolpayloads::MainProtocol::TwoWayLocal>) ==
    TypeTraits<::fidl::internal::TransactionalResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayLocal>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalResponse<
                           ::test_protocolpayloads::MainProtocol::TwoWayLocal>,
                       header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalResponse<
                           ::test_protocolpayloads::MainProtocol::TwoWayLocal>,
                       body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<
    ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayLocal>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::test_protocolpayloads_LocalStructPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 8;
  static constexpr uint32_t kPrimarySizeV1 = 8;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireResponse<
           ::test_protocolpayloads::MainProtocol::TwoWayLocal>) ==
    TypeTraits<::fidl::WireResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayLocal>>::kPrimarySize);
static_assert(offsetof(::fidl::WireResponse<
                           ::test_protocolpayloads::MainProtocol::TwoWayLocal>,
                       a) == 0);
static_assert(offsetof(::fidl::WireResponse<
                           ::test_protocolpayloads::MainProtocol::TwoWayLocal>,
                       b) == 4);

template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::WireRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::test_protocolpayloads_LocalStructPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(8 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(8 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(
    sizeof(::fidl::internal::TransactionalRequest<
           ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>) ==
    TypeTraits<::fidl::internal::TransactionalRequest<
        ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>>::
        kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalRequest<
                 ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalRequest<
                 ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::test_protocolpayloads_LocalStructPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 8;
  static constexpr uint32_t kPrimarySizeV1 = 8;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};
static_assert(
    sizeof(::fidl::WireRequest<
           ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>) ==
    TypeTraits<::fidl::WireRequest<::test_protocolpayloads::MainProtocol::
                                       TwoWayLocalWithError>>::kPrimarySize);
static_assert(
    offsetof(::fidl::WireRequest<
                 ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>,
             a) == 0);
static_assert(
    offsetof(::fidl::WireRequest<
                 ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>,
             b) == 4);

template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::WireResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_MainProtocolTwoWayLocalWithErrorTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(24 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalResponse<
           ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>) ==
    TypeTraits<::fidl::internal::TransactionalResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>>::
        kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalResponse<
                 ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalResponse<
                 ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_MainProtocolTwoWayLocalWithErrorTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireResponse<
           ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>) ==
    TypeTraits<::fidl::WireResponse<::test_protocolpayloads::MainProtocol::
                                        TwoWayLocalWithError>>::kPrimarySize);
static_assert(
    offsetof(::fidl::WireResponse<
                 ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>,
             result) == 0);

template <>
struct IsFidlType<::fidl::internal::TransactionalEvent<
    ::test_protocolpayloads::MainProtocol::OnLocal>> : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnLocal>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalEvent<
    ::test_protocolpayloads::MainProtocol::OnLocal>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnLocal>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalEvent<
    ::test_protocolpayloads::MainProtocol::OnLocal>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::test_protocolpayloads_LocalStructPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(8 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(8 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalEvent<
           ::test_protocolpayloads::MainProtocol::OnLocal>) ==
    TypeTraits<::fidl::internal::TransactionalEvent<
        ::test_protocolpayloads::MainProtocol::OnLocal>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalEvent<
                           ::test_protocolpayloads::MainProtocol::OnLocal>,
                       header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalEvent<
                           ::test_protocolpayloads::MainProtocol::OnLocal>,
                       body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<
    ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnLocal>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::test_protocolpayloads_LocalStructPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 8;
  static constexpr uint32_t kPrimarySizeV1 = 8;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnLocal>) ==
    TypeTraits<::fidl::WireEvent<
        ::test_protocolpayloads::MainProtocol::OnLocal>>::kPrimarySize);
static_assert(
    offsetof(::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnLocal>,
             a) == 0);
static_assert(
    offsetof(::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnLocal>,
             b) == 4);

template <>
struct IsFidlType<::fidl::internal::TransactionalEvent<
    ::test_protocolpayloads::MainProtocol::OnLocalWithError>>
    : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnLocalWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalEvent<
    ::test_protocolpayloads::MainProtocol::OnLocalWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnLocalWithError>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalEvent<
    ::test_protocolpayloads::MainProtocol::OnLocalWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_MainProtocolOnLocalWithErrorRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(24 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalEvent<
           ::test_protocolpayloads::MainProtocol::OnLocalWithError>) ==
    TypeTraits<::fidl::internal::TransactionalEvent<
        ::test_protocolpayloads::MainProtocol::OnLocalWithError>>::
        kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalEvent<
                 ::test_protocolpayloads::MainProtocol::OnLocalWithError>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalEvent<
                 ::test_protocolpayloads::MainProtocol::OnLocalWithError>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireEvent<
    ::test_protocolpayloads::MainProtocol::OnLocalWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_MainProtocolOnLocalWithErrorRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireEvent<
           ::test_protocolpayloads::MainProtocol::OnLocalWithError>) ==
    TypeTraits<::fidl::WireEvent<::test_protocolpayloads::MainProtocol::
                                     OnLocalWithError>>::kPrimarySize);
static_assert(
    offsetof(::fidl::WireEvent<
                 ::test_protocolpayloads::MainProtocol::OnLocalWithError>,
             result) == 0);

template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::OneWayImport>>
    : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::OneWayImport>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::OneWayImport>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::OneWayImport>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::OneWayImport>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_imported_ImportStructPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(4 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(4 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(
    sizeof(::fidl::internal::TransactionalRequest<
           ::test_protocolpayloads::MainProtocol::OneWayImport>) ==
    TypeTraits<::fidl::internal::TransactionalRequest<
        ::test_protocolpayloads::MainProtocol::OneWayImport>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<
                           ::test_protocolpayloads::MainProtocol::OneWayImport>,
                       header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<
                           ::test_protocolpayloads::MainProtocol::OneWayImport>,
                       body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<
    ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::OneWayImport>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_imported_ImportStructPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 4;
  static constexpr uint32_t kPrimarySizeV1 = 4;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};
static_assert(
    sizeof(::fidl::WireRequest<
           ::test_protocolpayloads::MainProtocol::OneWayImport>) ==
    TypeTraits<::fidl::WireRequest<
        ::test_protocolpayloads::MainProtocol::OneWayImport>>::kPrimarySize);
static_assert(offsetof(::fidl::WireRequest<
                           ::test_protocolpayloads::MainProtocol::OneWayImport>,
                       a) == 0);

template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayImport>>
    : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::TwoWayImport>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayImport>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::TwoWayImport>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayImport>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_imported_ImportStructPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(4 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(4 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(
    sizeof(::fidl::internal::TransactionalRequest<
           ::test_protocolpayloads::MainProtocol::TwoWayImport>) ==
    TypeTraits<::fidl::internal::TransactionalRequest<
        ::test_protocolpayloads::MainProtocol::TwoWayImport>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<
                           ::test_protocolpayloads::MainProtocol::TwoWayImport>,
                       header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<
                           ::test_protocolpayloads::MainProtocol::TwoWayImport>,
                       body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<
    ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::TwoWayImport>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_imported_ImportStructPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 4;
  static constexpr uint32_t kPrimarySizeV1 = 4;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};
static_assert(
    sizeof(::fidl::WireRequest<
           ::test_protocolpayloads::MainProtocol::TwoWayImport>) ==
    TypeTraits<::fidl::WireRequest<
        ::test_protocolpayloads::MainProtocol::TwoWayImport>>::kPrimarySize);
static_assert(offsetof(::fidl::WireRequest<
                           ::test_protocolpayloads::MainProtocol::TwoWayImport>,
                       a) == 0);

template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayImport>>
    : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayImport>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayImport>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayImport>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayImport>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_imported_ImportStructPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(4 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(4 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalResponse<
           ::test_protocolpayloads::MainProtocol::TwoWayImport>) ==
    TypeTraits<::fidl::internal::TransactionalResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayImport>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalResponse<
                           ::test_protocolpayloads::MainProtocol::TwoWayImport>,
                       header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalResponse<
                           ::test_protocolpayloads::MainProtocol::TwoWayImport>,
                       body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<
    ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayImport>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_imported_ImportStructPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 4;
  static constexpr uint32_t kPrimarySizeV1 = 4;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireResponse<
           ::test_protocolpayloads::MainProtocol::TwoWayImport>) ==
    TypeTraits<::fidl::WireResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayImport>>::kPrimarySize);
static_assert(offsetof(::fidl::WireResponse<
                           ::test_protocolpayloads::MainProtocol::TwoWayImport>,
                       a) == 0);

template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::WireRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_imported_ImportStructPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(4 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(4 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(
    sizeof(::fidl::internal::TransactionalRequest<
           ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>) ==
    TypeTraits<::fidl::internal::TransactionalRequest<
        ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>>::
        kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalRequest<
                 ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalRequest<
                 ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_imported_ImportStructPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 4;
  static constexpr uint32_t kPrimarySizeV1 = 4;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};
static_assert(
    sizeof(::fidl::WireRequest<
           ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>) ==
    TypeTraits<::fidl::WireRequest<::test_protocolpayloads::MainProtocol::
                                       TwoWayImportWithError>>::kPrimarySize);
static_assert(
    offsetof(::fidl::WireRequest<
                 ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>,
             a) == 0);

template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::WireResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_MainProtocolTwoWayImportWithErrorTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(24 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalResponse<
           ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>) ==
    TypeTraits<::fidl::internal::TransactionalResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>>::
        kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalResponse<
                 ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalResponse<
                 ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_MainProtocolTwoWayImportWithErrorTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireResponse<
           ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>) ==
    TypeTraits<::fidl::WireResponse<::test_protocolpayloads::MainProtocol::
                                        TwoWayImportWithError>>::kPrimarySize);
static_assert(
    offsetof(::fidl::WireResponse<
                 ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>,
             result) == 0);

template <>
struct IsFidlType<::fidl::internal::TransactionalEvent<
    ::test_protocolpayloads::MainProtocol::OnImport>> : public std::true_type {
};
template <>
struct IsFidlType<
    ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnImport>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalEvent<
    ::test_protocolpayloads::MainProtocol::OnImport>> : public std::true_type {
};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnImport>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalEvent<
    ::test_protocolpayloads::MainProtocol::OnImport>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_imported_ImportStructPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(4 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(4 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalEvent<
           ::test_protocolpayloads::MainProtocol::OnImport>) ==
    TypeTraits<::fidl::internal::TransactionalEvent<
        ::test_protocolpayloads::MainProtocol::OnImport>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalEvent<
                           ::test_protocolpayloads::MainProtocol::OnImport>,
                       header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalEvent<
                           ::test_protocolpayloads::MainProtocol::OnImport>,
                       body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<
    ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnImport>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_imported_ImportStructPayloadTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 4;
  static constexpr uint32_t kPrimarySizeV1 = 4;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(
        ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnImport>) ==
    TypeTraits<::fidl::WireEvent<
        ::test_protocolpayloads::MainProtocol::OnImport>>::kPrimarySize);
static_assert(
    offsetof(::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnImport>,
             a) == 0);

template <>
struct IsFidlType<::fidl::internal::TransactionalEvent<
    ::test_protocolpayloads::MainProtocol::OnImportWithError>>
    : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnImportWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalEvent<
    ::test_protocolpayloads::MainProtocol::OnImportWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnImportWithError>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalEvent<
    ::test_protocolpayloads::MainProtocol::OnImportWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_MainProtocolOnImportWithErrorRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(24 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalEvent<
           ::test_protocolpayloads::MainProtocol::OnImportWithError>) ==
    TypeTraits<::fidl::internal::TransactionalEvent<
        ::test_protocolpayloads::MainProtocol::OnImportWithError>>::
        kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalEvent<
                 ::test_protocolpayloads::MainProtocol::OnImportWithError>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalEvent<
                 ::test_protocolpayloads::MainProtocol::OnImportWithError>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireEvent<
    ::test_protocolpayloads::MainProtocol::OnImportWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_MainProtocolOnImportWithErrorRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireEvent<
           ::test_protocolpayloads::MainProtocol::OnImportWithError>) ==
    TypeTraits<::fidl::WireEvent<::test_protocolpayloads::MainProtocol::
                                     OnImportWithError>>::kPrimarySize);
static_assert(
    offsetof(::fidl::WireEvent<
                 ::test_protocolpayloads::MainProtocol::OnImportWithError>,
             result) == 0);

template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::OneWayAnon>>
    : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::OneWayAnon>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::OneWayAnon>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::OneWayAnon>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::OneWayAnon>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_MainProtocolOneWayAnonRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(8 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(8 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(
    sizeof(::fidl::internal::TransactionalRequest<
           ::test_protocolpayloads::MainProtocol::OneWayAnon>) ==
    TypeTraits<::fidl::internal::TransactionalRequest<
        ::test_protocolpayloads::MainProtocol::OneWayAnon>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<
                           ::test_protocolpayloads::MainProtocol::OneWayAnon>,
                       header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<
                           ::test_protocolpayloads::MainProtocol::OneWayAnon>,
                       body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<
    ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::OneWayAnon>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_MainProtocolOneWayAnonRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 8;
  static constexpr uint32_t kPrimarySizeV1 = 8;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};
static_assert(
    sizeof(::fidl::WireRequest<
           ::test_protocolpayloads::MainProtocol::OneWayAnon>) ==
    TypeTraits<::fidl::WireRequest<
        ::test_protocolpayloads::MainProtocol::OneWayAnon>>::kPrimarySize);
static_assert(
    offsetof(
        ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::OneWayAnon>,
        a) == 0);
static_assert(
    offsetof(
        ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::OneWayAnon>,
        b) == 4);

template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayAnon>>
    : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::TwoWayAnon>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayAnon>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::TwoWayAnon>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayAnon>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_MainProtocolTwoWayAnonRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(8 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(8 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(
    sizeof(::fidl::internal::TransactionalRequest<
           ::test_protocolpayloads::MainProtocol::TwoWayAnon>) ==
    TypeTraits<::fidl::internal::TransactionalRequest<
        ::test_protocolpayloads::MainProtocol::TwoWayAnon>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<
                           ::test_protocolpayloads::MainProtocol::TwoWayAnon>,
                       header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalRequest<
                           ::test_protocolpayloads::MainProtocol::TwoWayAnon>,
                       body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<
    ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::TwoWayAnon>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_MainProtocolTwoWayAnonRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 8;
  static constexpr uint32_t kPrimarySizeV1 = 8;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};
static_assert(
    sizeof(::fidl::WireRequest<
           ::test_protocolpayloads::MainProtocol::TwoWayAnon>) ==
    TypeTraits<::fidl::WireRequest<
        ::test_protocolpayloads::MainProtocol::TwoWayAnon>>::kPrimarySize);
static_assert(
    offsetof(
        ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::TwoWayAnon>,
        a) == 0);
static_assert(
    offsetof(
        ::fidl::WireRequest<::test_protocolpayloads::MainProtocol::TwoWayAnon>,
        b) == 4);

template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayAnon>>
    : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayAnon>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayAnon>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayAnon>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayAnon>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_MainProtocolTwoWayAnonTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(8 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(8 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalResponse<
           ::test_protocolpayloads::MainProtocol::TwoWayAnon>) ==
    TypeTraits<::fidl::internal::TransactionalResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayAnon>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalResponse<
                           ::test_protocolpayloads::MainProtocol::TwoWayAnon>,
                       header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalResponse<
                           ::test_protocolpayloads::MainProtocol::TwoWayAnon>,
                       body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<
    ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayAnon>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_MainProtocolTwoWayAnonTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 8;
  static constexpr uint32_t kPrimarySizeV1 = 8;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireResponse<
           ::test_protocolpayloads::MainProtocol::TwoWayAnon>) ==
    TypeTraits<::fidl::WireResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayAnon>>::kPrimarySize);
static_assert(
    offsetof(
        ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayAnon>,
        a) == 0);
static_assert(
    offsetof(
        ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayAnon>,
        b) == 4);

template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::WireRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_MainProtocolTwoWayAnonWithErrorRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(8 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(8 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(
    sizeof(::fidl::internal::TransactionalRequest<
           ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>) ==
    TypeTraits<::fidl::internal::TransactionalRequest<
        ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>>::
        kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalRequest<
                 ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalRequest<
                 ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireRequest<
    ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_MainProtocolTwoWayAnonWithErrorRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 8;
  static constexpr uint32_t kPrimarySizeV1 = 8;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};
static_assert(
    sizeof(::fidl::WireRequest<
           ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>) ==
    TypeTraits<::fidl::WireRequest<::test_protocolpayloads::MainProtocol::
                                       TwoWayAnonWithError>>::kPrimarySize);
static_assert(
    offsetof(::fidl::WireRequest<
                 ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>,
             a) == 0);
static_assert(
    offsetof(::fidl::WireRequest<
                 ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>,
             b) == 4);

template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::WireResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_MainProtocolTwoWayAnonWithErrorTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(24 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalResponse<
           ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>) ==
    TypeTraits<::fidl::internal::TransactionalResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>>::
        kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalResponse<
                 ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalResponse<
                 ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireResponse<
    ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_MainProtocolTwoWayAnonWithErrorTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireResponse<
           ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>) ==
    TypeTraits<::fidl::WireResponse<::test_protocolpayloads::MainProtocol::
                                        TwoWayAnonWithError>>::kPrimarySize);
static_assert(
    offsetof(::fidl::WireResponse<
                 ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>,
             result) == 0);

template <>
struct IsFidlType<::fidl::internal::TransactionalEvent<
    ::test_protocolpayloads::MainProtocol::OnAnon>> : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnAnon>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalEvent<
    ::test_protocolpayloads::MainProtocol::OnAnon>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnAnon>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalEvent<
    ::test_protocolpayloads::MainProtocol::OnAnon>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_MainProtocolOnAnonRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(8 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(8 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalEvent<
           ::test_protocolpayloads::MainProtocol::OnAnon>) ==
    TypeTraits<::fidl::internal::TransactionalEvent<
        ::test_protocolpayloads::MainProtocol::OnAnon>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalEvent<
                           ::test_protocolpayloads::MainProtocol::OnAnon>,
                       header) == 0);
static_assert(offsetof(::fidl::internal::TransactionalEvent<
                           ::test_protocolpayloads::MainProtocol::OnAnon>,
                       body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<
    ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnAnon>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_MainProtocolOnAnonRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 8;
  static constexpr uint32_t kPrimarySizeV1 = 8;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnAnon>) ==
    TypeTraits<::fidl::WireEvent<
        ::test_protocolpayloads::MainProtocol::OnAnon>>::kPrimarySize);
static_assert(
    offsetof(::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnAnon>,
             a) == 0);
static_assert(
    offsetof(::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnAnon>,
             b) == 4);

template <>
struct IsFidlType<::fidl::internal::TransactionalEvent<
    ::test_protocolpayloads::MainProtocol::OnAnonWithError>>
    : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnAnonWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalEvent<
    ::test_protocolpayloads::MainProtocol::OnAnonWithError>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnAnonWithError>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalEvent<
    ::test_protocolpayloads::MainProtocol::OnAnonWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_MainProtocolOnAnonWithErrorRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(24 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalEvent<
           ::test_protocolpayloads::MainProtocol::OnAnonWithError>) ==
    TypeTraits<::fidl::internal::TransactionalEvent<
        ::test_protocolpayloads::MainProtocol::OnAnonWithError>>::kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalEvent<
                 ::test_protocolpayloads::MainProtocol::OnAnonWithError>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalEvent<
                 ::test_protocolpayloads::MainProtocol::OnAnonWithError>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<
    ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnAnonWithError>> {
  static constexpr const fidl_type_t* kType =
      &::test_protocolpayloads::
          test_protocolpayloads_MainProtocolOnAnonWithErrorRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireEvent<
           ::test_protocolpayloads::MainProtocol::OnAnonWithError>) ==
    TypeTraits<::fidl::WireEvent<
        ::test_protocolpayloads::MainProtocol::OnAnonWithError>>::kPrimarySize);
static_assert(
    offsetof(::fidl::WireEvent<
                 ::test_protocolpayloads::MainProtocol::OnAnonWithError>,
             result) == 0);

}  // namespace fidl
namespace test_protocolpayloads {
#ifdef __Fuchsia__
}  // namespace test_protocolpayloads
template <>
class [[nodiscard]] ::fidl::WireResult<
    ::test_protocolpayloads::MainProtocol::OneWayComposed>
    final : public ::fidl::Status {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocolpayloads::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocolpayloads::MainProtocol::OneWayComposed>* request);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;

 private:
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<
    ::test_protocolpayloads::MainProtocol::OneWayComposed>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_protocolpayloads::MainProtocol>
          client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<
          ::test_protocolpayloads::MainProtocol::OneWayComposed>* request);
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
};
template <>
class [[nodiscard]] ::fidl::WireResult<
    ::test_protocolpayloads::MainProtocol::TwoWayComposed>
    final : public ::fidl::Status {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocolpayloads::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocolpayloads::MainProtocol::TwoWayComposed>* request);
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocolpayloads::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocolpayloads::MainProtocol::TwoWayComposed>* request,
      zx_time_t _deadline);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;
  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayComposed>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<::fidl::WireResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayComposed>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayComposed>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<const ::fidl::WireResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayComposed>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayComposed>*
  Unwrap_NEW() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<::fidl::WireResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayComposed>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayComposed>*
  Unwrap_NEW() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<const ::fidl::WireResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayComposed>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayComposed>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayComposed>&
  value() const {
    return *Unwrap();
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayComposed>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayComposed>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayComposed>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayComposed>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayComposed>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayComposed>&
  operator*() const {
    return value();
  }

 private:
  ::fidl::internal::InlineMessageBuffer<24> bytes_;
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<
    ::test_protocolpayloads::MainProtocol::TwoWayComposed>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_protocolpayloads::MainProtocol>
          client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<
          ::test_protocolpayloads::MainProtocol::TwoWayComposed>* request);
  explicit WireUnownedResult(
      ::fidl::internal::TransactionalResponse<
          ::test_protocolpayloads::MainProtocol::TwoWayComposed>* response)
      : bytes_(reinterpret_cast<uint8_t*>(response)) {}
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  explicit WireUnownedResult(
      ::fidl::unstable::DecodedMessage<::fidl::internal::TransactionalResponse<
          ::test_protocolpayloads::MainProtocol::TwoWayComposed>>&& decoded,
      ::fidl::internal::IncomingTransportContext context)
      : ::fidl::Status(decoded) {
    if (decoded.ok()) {
      bytes_ = reinterpret_cast<uint8_t*>(decoded.PrimaryObject());
    } else {
      bytes_ = nullptr;
    }
    decoded.ReleasePrimaryObject();
  }
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayComposed>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return &(
        reinterpret_cast<::fidl::internal::TransactionalResponse<
            ::test_protocolpayloads::MainProtocol::TwoWayComposed>*>(bytes_)
            ->body);
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayComposed>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return &(
        reinterpret_cast<const ::fidl::internal::TransactionalResponse<
            ::test_protocolpayloads::MainProtocol::TwoWayComposed>*>(bytes_)
            ->body);
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayComposed>*
  Unwrap_NEW() {
    ZX_DEBUG_ASSERT(ok());
    return &(
        reinterpret_cast<::fidl::internal::TransactionalResponse<
            ::test_protocolpayloads::MainProtocol::TwoWayComposed>*>(bytes_)
            ->body);
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayComposed>*
  Unwrap_NEW() const {
    ZX_DEBUG_ASSERT(ok());
    return &(
        reinterpret_cast<const ::fidl::internal::TransactionalResponse<
            ::test_protocolpayloads::MainProtocol::TwoWayComposed>*>(bytes_)
            ->body);
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayComposed>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayComposed>&
  value() const {
    return *Unwrap();
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayComposed>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayComposed>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayComposed>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayComposed>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayComposed>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayComposed>&
  operator*() const {
    return value();
  }

 private:
  uint8_t* bytes_;
};
template <>
class [[nodiscard]] ::fidl::WireResult<
    ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>
    final : public ::fidl::Status {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocolpayloads::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>*
          request);
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocolpayloads::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>*
          request,
      zx_time_t _deadline);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;
  ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<::fidl::WireResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<const ::fidl::WireResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fitx::result<uint32_t,
                 ::test_protocolpayloads_imported::wire::ImportStructPayload*>*
  Unwrap_NEW() {
    return &result_.value();
  }
  const ::fitx::result<
      uint32_t, ::test_protocolpayloads_imported::wire::ImportStructPayload*>*
  Unwrap_NEW() const {
    return &result_.value();
  }

  ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>&
  value() const {
    return *Unwrap();
  }

  ::fitx::result<uint32_t,
                 ::test_protocolpayloads_imported::wire::ImportStructPayload*>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fitx::result<
      uint32_t, ::test_protocolpayloads_imported::wire::ImportStructPayload*>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>&
  operator*() const {
    return value();
  }

 private:
  ::fidl::internal::InlineMessageBuffer<48> bytes_;
  std::optional<::fitx::result<
      uint32_t, ::test_protocolpayloads_imported::wire::ImportStructPayload*>>
      result_ = std::nullopt;
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<
    ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_protocolpayloads::MainProtocol>
          client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<
          ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>*
          request);
  explicit WireUnownedResult(
      ::fidl::internal::TransactionalResponse<
          ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>*
          response)
      : bytes_(reinterpret_cast<uint8_t*>(response)) {
    auto* raw_response = reinterpret_cast<::fidl::WireResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>*>(
        bytes_ + sizeof(fidl_message_header_t));
    if (raw_response->result.is_err()) {
      result_ = fitx::error(raw_response->result.err());
    } else {
      result_ = fitx::ok(&(raw_response->result.response()));
    }
  }
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  explicit WireUnownedResult(
      ::fidl::unstable::DecodedMessage<::fidl::internal::TransactionalResponse<
          ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>>&&
          decoded,
      ::fidl::internal::IncomingTransportContext context)
      : ::fidl::Status(decoded) {
    if (decoded.ok()) {
      bytes_ = reinterpret_cast<uint8_t*>(decoded.PrimaryObject());
      auto* raw_response = reinterpret_cast<::fidl::WireResponse<
          ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>*>(
          bytes_ + sizeof(fidl_message_header_t));
      if (raw_response->result.is_err()) {
        result_ = fitx::error(raw_response->result.err());
      } else if (raw_response->result.is_response()) {
        result_ = fitx::ok(&(raw_response->result.response()));
      }
    } else {
      bytes_ = nullptr;
    }
    decoded.ReleasePrimaryObject();
  }
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
  ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return &(
        reinterpret_cast<::fidl::internal::TransactionalResponse<
            ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>*>(
            bytes_)
            ->body);
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return &(
        reinterpret_cast<const ::fidl::internal::TransactionalResponse<
            ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>*>(
            bytes_)
            ->body);
  }

  ::fitx::result<uint32_t,
                 ::test_protocolpayloads_imported::wire::ImportStructPayload*>*
  Unwrap_NEW() {
    return &result_.value();
  }
  const ::fitx::result<
      uint32_t, ::test_protocolpayloads_imported::wire::ImportStructPayload*>*
  Unwrap_NEW() const {
    return &result_.value();
  }

  ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>&
  value() const {
    return *Unwrap();
  }

  ::fitx::result<uint32_t,
                 ::test_protocolpayloads_imported::wire::ImportStructPayload*>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fitx::result<
      uint32_t, ::test_protocolpayloads_imported::wire::ImportStructPayload*>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>&
  operator*() const {
    return value();
  }

 private:
  uint8_t* bytes_;
  std::optional<::fitx::result<
      uint32_t, ::test_protocolpayloads_imported::wire::ImportStructPayload*>>
      result_ = std::nullopt;
};
template <>
class [[nodiscard]] ::fidl::WireResult<
    ::test_protocolpayloads::MainProtocol::OneWayLocal>
    final : public ::fidl::Status {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocolpayloads::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocolpayloads::MainProtocol::OneWayLocal>* request);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;

 private:
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<
    ::test_protocolpayloads::MainProtocol::OneWayLocal>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_protocolpayloads::MainProtocol>
          client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<
          ::test_protocolpayloads::MainProtocol::OneWayLocal>* request);
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
};
template <>
class [[nodiscard]] ::fidl::WireResult<
    ::test_protocolpayloads::MainProtocol::TwoWayLocal>
    final : public ::fidl::Status {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocolpayloads::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocolpayloads::MainProtocol::TwoWayLocal>* request);
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocolpayloads::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocolpayloads::MainProtocol::TwoWayLocal>* request,
      zx_time_t _deadline);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;
  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayLocal>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<::fidl::WireResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayLocal>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayLocal>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<const ::fidl::WireResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayLocal>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayLocal>*
  Unwrap_NEW() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<::fidl::WireResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayLocal>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayLocal>*
  Unwrap_NEW() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<const ::fidl::WireResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayLocal>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayLocal>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayLocal>&
  value() const {
    return *Unwrap();
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayLocal>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayLocal>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayLocal>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayLocal>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayLocal>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayLocal>&
  operator*() const {
    return value();
  }

 private:
  ::fidl::internal::InlineMessageBuffer<24> bytes_;
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<
    ::test_protocolpayloads::MainProtocol::TwoWayLocal>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_protocolpayloads::MainProtocol>
          client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<
          ::test_protocolpayloads::MainProtocol::TwoWayLocal>* request);
  explicit WireUnownedResult(
      ::fidl::internal::TransactionalResponse<
          ::test_protocolpayloads::MainProtocol::TwoWayLocal>* response)
      : bytes_(reinterpret_cast<uint8_t*>(response)) {}
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  explicit WireUnownedResult(
      ::fidl::unstable::DecodedMessage<::fidl::internal::TransactionalResponse<
          ::test_protocolpayloads::MainProtocol::TwoWayLocal>>&& decoded,
      ::fidl::internal::IncomingTransportContext context)
      : ::fidl::Status(decoded) {
    if (decoded.ok()) {
      bytes_ = reinterpret_cast<uint8_t*>(decoded.PrimaryObject());
    } else {
      bytes_ = nullptr;
    }
    decoded.ReleasePrimaryObject();
  }
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayLocal>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<::fidl::internal::TransactionalResponse<
                 ::test_protocolpayloads::MainProtocol::TwoWayLocal>*>(bytes_)
                 ->body);
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayLocal>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<const ::fidl::internal::TransactionalResponse<
                 ::test_protocolpayloads::MainProtocol::TwoWayLocal>*>(bytes_)
                 ->body);
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayLocal>*
  Unwrap_NEW() {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<::fidl::internal::TransactionalResponse<
                 ::test_protocolpayloads::MainProtocol::TwoWayLocal>*>(bytes_)
                 ->body);
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayLocal>*
  Unwrap_NEW() const {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<const ::fidl::internal::TransactionalResponse<
                 ::test_protocolpayloads::MainProtocol::TwoWayLocal>*>(bytes_)
                 ->body);
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayLocal>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayLocal>&
  value() const {
    return *Unwrap();
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayLocal>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayLocal>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayLocal>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayLocal>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayLocal>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayLocal>&
  operator*() const {
    return value();
  }

 private:
  uint8_t* bytes_;
};
template <>
class [[nodiscard]] ::fidl::WireResult<
    ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>
    final : public ::fidl::Status {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocolpayloads::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>*
          request);
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocolpayloads::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>* request,
      zx_time_t _deadline);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;
  ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<::fidl::WireResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<const ::fidl::WireResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fitx::result<uint32_t, ::test_protocolpayloads::wire::LocalStructPayload*>*
  Unwrap_NEW() {
    return &result_.value();
  }
  const ::fitx::result<uint32_t,
                       ::test_protocolpayloads::wire::LocalStructPayload*>*
  Unwrap_NEW() const {
    return &result_.value();
  }

  ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>&
  value() const {
    return *Unwrap();
  }

  ::fitx::result<uint32_t, ::test_protocolpayloads::wire::LocalStructPayload*>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fitx::result<uint32_t,
                       ::test_protocolpayloads::wire::LocalStructPayload*>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>&
  operator*() const {
    return value();
  }

 private:
  ::fidl::internal::InlineMessageBuffer<48> bytes_;
  std::optional<::fitx::result<
      uint32_t, ::test_protocolpayloads::wire::LocalStructPayload*>>
      result_ = std::nullopt;
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<
    ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_protocolpayloads::MainProtocol>
          client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<
          ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>*
          request);
  explicit WireUnownedResult(
      ::fidl::internal::TransactionalResponse<
          ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>*
          response)
      : bytes_(reinterpret_cast<uint8_t*>(response)) {
    auto* raw_response = reinterpret_cast<::fidl::WireResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>*>(
        bytes_ + sizeof(fidl_message_header_t));
    if (raw_response->result.is_err()) {
      result_ = fitx::error(raw_response->result.err());
    } else {
      result_ = fitx::ok(&(raw_response->result.response()));
    }
  }
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  explicit WireUnownedResult(
      ::fidl::unstable::DecodedMessage<::fidl::internal::TransactionalResponse<
          ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>>&&
          decoded,
      ::fidl::internal::IncomingTransportContext context)
      : ::fidl::Status(decoded) {
    if (decoded.ok()) {
      bytes_ = reinterpret_cast<uint8_t*>(decoded.PrimaryObject());
      auto* raw_response = reinterpret_cast<::fidl::WireResponse<
          ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>*>(
          bytes_ + sizeof(fidl_message_header_t));
      if (raw_response->result.is_err()) {
        result_ = fitx::error(raw_response->result.err());
      } else if (raw_response->result.is_response()) {
        result_ = fitx::ok(&(raw_response->result.response()));
      }
    } else {
      bytes_ = nullptr;
    }
    decoded.ReleasePrimaryObject();
  }
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
  ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<::fidl::internal::TransactionalResponse<
                 ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>*>(
                 bytes_)
                 ->body);
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<const ::fidl::internal::TransactionalResponse<
                 ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>*>(
                 bytes_)
                 ->body);
  }

  ::fitx::result<uint32_t, ::test_protocolpayloads::wire::LocalStructPayload*>*
  Unwrap_NEW() {
    return &result_.value();
  }
  const ::fitx::result<uint32_t,
                       ::test_protocolpayloads::wire::LocalStructPayload*>*
  Unwrap_NEW() const {
    return &result_.value();
  }

  ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>&
  value() const {
    return *Unwrap();
  }

  ::fitx::result<uint32_t, ::test_protocolpayloads::wire::LocalStructPayload*>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fitx::result<uint32_t,
                       ::test_protocolpayloads::wire::LocalStructPayload*>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>&
  operator*() const {
    return value();
  }

 private:
  uint8_t* bytes_;
  std::optional<::fitx::result<
      uint32_t, ::test_protocolpayloads::wire::LocalStructPayload*>>
      result_ = std::nullopt;
};
template <>
class [[nodiscard]] ::fidl::WireResult<
    ::test_protocolpayloads::MainProtocol::OneWayImport>
    final : public ::fidl::Status {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocolpayloads::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocolpayloads::MainProtocol::OneWayImport>* request);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;

 private:
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<
    ::test_protocolpayloads::MainProtocol::OneWayImport>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_protocolpayloads::MainProtocol>
          client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<
          ::test_protocolpayloads::MainProtocol::OneWayImport>* request);
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
};
template <>
class [[nodiscard]] ::fidl::WireResult<
    ::test_protocolpayloads::MainProtocol::TwoWayImport>
    final : public ::fidl::Status {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocolpayloads::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocolpayloads::MainProtocol::TwoWayImport>* request);
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocolpayloads::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocolpayloads::MainProtocol::TwoWayImport>* request,
      zx_time_t _deadline);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;
  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayImport>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<::fidl::WireResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayImport>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayImport>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<const ::fidl::WireResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayImport>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayImport>*
  Unwrap_NEW() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<::fidl::WireResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayImport>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayImport>*
  Unwrap_NEW() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<const ::fidl::WireResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayImport>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayImport>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayImport>&
  value() const {
    return *Unwrap();
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayImport>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayImport>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayImport>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayImport>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayImport>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayImport>&
  operator*() const {
    return value();
  }

 private:
  ::fidl::internal::InlineMessageBuffer<24> bytes_;
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<
    ::test_protocolpayloads::MainProtocol::TwoWayImport>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_protocolpayloads::MainProtocol>
          client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<
          ::test_protocolpayloads::MainProtocol::TwoWayImport>* request);
  explicit WireUnownedResult(
      ::fidl::internal::TransactionalResponse<
          ::test_protocolpayloads::MainProtocol::TwoWayImport>* response)
      : bytes_(reinterpret_cast<uint8_t*>(response)) {}
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  explicit WireUnownedResult(
      ::fidl::unstable::DecodedMessage<::fidl::internal::TransactionalResponse<
          ::test_protocolpayloads::MainProtocol::TwoWayImport>>&& decoded,
      ::fidl::internal::IncomingTransportContext context)
      : ::fidl::Status(decoded) {
    if (decoded.ok()) {
      bytes_ = reinterpret_cast<uint8_t*>(decoded.PrimaryObject());
    } else {
      bytes_ = nullptr;
    }
    decoded.ReleasePrimaryObject();
  }
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayImport>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<::fidl::internal::TransactionalResponse<
                 ::test_protocolpayloads::MainProtocol::TwoWayImport>*>(bytes_)
                 ->body);
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayImport>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<const ::fidl::internal::TransactionalResponse<
                 ::test_protocolpayloads::MainProtocol::TwoWayImport>*>(bytes_)
                 ->body);
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayImport>*
  Unwrap_NEW() {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<::fidl::internal::TransactionalResponse<
                 ::test_protocolpayloads::MainProtocol::TwoWayImport>*>(bytes_)
                 ->body);
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayImport>*
  Unwrap_NEW() const {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<const ::fidl::internal::TransactionalResponse<
                 ::test_protocolpayloads::MainProtocol::TwoWayImport>*>(bytes_)
                 ->body);
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayImport>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayImport>&
  value() const {
    return *Unwrap();
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayImport>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayImport>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayImport>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayImport>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayImport>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayImport>&
  operator*() const {
    return value();
  }

 private:
  uint8_t* bytes_;
};
template <>
class [[nodiscard]] ::fidl::WireResult<
    ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>
    final : public ::fidl::Status {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocolpayloads::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>*
          request);
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocolpayloads::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>*
          request,
      zx_time_t _deadline);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;
  ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<::fidl::WireResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<const ::fidl::WireResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fitx::result<uint32_t,
                 ::test_protocolpayloads_imported::wire::ImportStructPayload*>*
  Unwrap_NEW() {
    return &result_.value();
  }
  const ::fitx::result<
      uint32_t, ::test_protocolpayloads_imported::wire::ImportStructPayload*>*
  Unwrap_NEW() const {
    return &result_.value();
  }

  ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>&
  value() const {
    return *Unwrap();
  }

  ::fitx::result<uint32_t,
                 ::test_protocolpayloads_imported::wire::ImportStructPayload*>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fitx::result<
      uint32_t, ::test_protocolpayloads_imported::wire::ImportStructPayload*>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>&
  operator*() const {
    return value();
  }

 private:
  ::fidl::internal::InlineMessageBuffer<48> bytes_;
  std::optional<::fitx::result<
      uint32_t, ::test_protocolpayloads_imported::wire::ImportStructPayload*>>
      result_ = std::nullopt;
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<
    ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_protocolpayloads::MainProtocol>
          client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<
          ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>*
          request);
  explicit WireUnownedResult(
      ::fidl::internal::TransactionalResponse<
          ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>*
          response)
      : bytes_(reinterpret_cast<uint8_t*>(response)) {
    auto* raw_response = reinterpret_cast<::fidl::WireResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>*>(
        bytes_ + sizeof(fidl_message_header_t));
    if (raw_response->result.is_err()) {
      result_ = fitx::error(raw_response->result.err());
    } else {
      result_ = fitx::ok(&(raw_response->result.response()));
    }
  }
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  explicit WireUnownedResult(
      ::fidl::unstable::DecodedMessage<::fidl::internal::TransactionalResponse<
          ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>>&&
          decoded,
      ::fidl::internal::IncomingTransportContext context)
      : ::fidl::Status(decoded) {
    if (decoded.ok()) {
      bytes_ = reinterpret_cast<uint8_t*>(decoded.PrimaryObject());
      auto* raw_response = reinterpret_cast<::fidl::WireResponse<
          ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>*>(
          bytes_ + sizeof(fidl_message_header_t));
      if (raw_response->result.is_err()) {
        result_ = fitx::error(raw_response->result.err());
      } else if (raw_response->result.is_response()) {
        result_ = fitx::ok(&(raw_response->result.response()));
      }
    } else {
      bytes_ = nullptr;
    }
    decoded.ReleasePrimaryObject();
  }
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
  ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return &(
        reinterpret_cast<::fidl::internal::TransactionalResponse<
            ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>*>(
            bytes_)
            ->body);
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return &(
        reinterpret_cast<const ::fidl::internal::TransactionalResponse<
            ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>*>(
            bytes_)
            ->body);
  }

  ::fitx::result<uint32_t,
                 ::test_protocolpayloads_imported::wire::ImportStructPayload*>*
  Unwrap_NEW() {
    return &result_.value();
  }
  const ::fitx::result<
      uint32_t, ::test_protocolpayloads_imported::wire::ImportStructPayload*>*
  Unwrap_NEW() const {
    return &result_.value();
  }

  ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>&
  value() const {
    return *Unwrap();
  }

  ::fitx::result<uint32_t,
                 ::test_protocolpayloads_imported::wire::ImportStructPayload*>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fitx::result<
      uint32_t, ::test_protocolpayloads_imported::wire::ImportStructPayload*>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>&
  operator*() const {
    return value();
  }

 private:
  uint8_t* bytes_;
  std::optional<::fitx::result<
      uint32_t, ::test_protocolpayloads_imported::wire::ImportStructPayload*>>
      result_ = std::nullopt;
};
template <>
class [[nodiscard]] ::fidl::WireResult<
    ::test_protocolpayloads::MainProtocol::OneWayAnon>
    final : public ::fidl::Status {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocolpayloads::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocolpayloads::MainProtocol::OneWayAnon>* request);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;

 private:
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<
    ::test_protocolpayloads::MainProtocol::OneWayAnon>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_protocolpayloads::MainProtocol>
          client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<
          ::test_protocolpayloads::MainProtocol::OneWayAnon>* request);
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
};
template <>
class [[nodiscard]] ::fidl::WireResult<
    ::test_protocolpayloads::MainProtocol::TwoWayAnon>
    final : public ::fidl::Status {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocolpayloads::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocolpayloads::MainProtocol::TwoWayAnon>* request);
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocolpayloads::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocolpayloads::MainProtocol::TwoWayAnon>* request,
      zx_time_t _deadline);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;
  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayAnon>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<::fidl::WireResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayAnon>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayAnon>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<const ::fidl::WireResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayAnon>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayAnon>*
  Unwrap_NEW() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<::fidl::WireResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayAnon>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayAnon>*
  Unwrap_NEW() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<const ::fidl::WireResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayAnon>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayAnon>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayAnon>&
  value() const {
    return *Unwrap();
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayAnon>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayAnon>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayAnon>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayAnon>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayAnon>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayAnon>&
  operator*() const {
    return value();
  }

 private:
  ::fidl::internal::InlineMessageBuffer<24> bytes_;
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<
    ::test_protocolpayloads::MainProtocol::TwoWayAnon>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_protocolpayloads::MainProtocol>
          client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<
          ::test_protocolpayloads::MainProtocol::TwoWayAnon>* request);
  explicit WireUnownedResult(
      ::fidl::internal::TransactionalResponse<
          ::test_protocolpayloads::MainProtocol::TwoWayAnon>* response)
      : bytes_(reinterpret_cast<uint8_t*>(response)) {}
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  explicit WireUnownedResult(
      ::fidl::unstable::DecodedMessage<::fidl::internal::TransactionalResponse<
          ::test_protocolpayloads::MainProtocol::TwoWayAnon>>&& decoded,
      ::fidl::internal::IncomingTransportContext context)
      : ::fidl::Status(decoded) {
    if (decoded.ok()) {
      bytes_ = reinterpret_cast<uint8_t*>(decoded.PrimaryObject());
    } else {
      bytes_ = nullptr;
    }
    decoded.ReleasePrimaryObject();
  }
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayAnon>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<::fidl::internal::TransactionalResponse<
                 ::test_protocolpayloads::MainProtocol::TwoWayAnon>*>(bytes_)
                 ->body);
  }
  const ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayAnon>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<const ::fidl::internal::TransactionalResponse<
                 ::test_protocolpayloads::MainProtocol::TwoWayAnon>*>(bytes_)
                 ->body);
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayAnon>*
  Unwrap_NEW() {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<::fidl::internal::TransactionalResponse<
                 ::test_protocolpayloads::MainProtocol::TwoWayAnon>*>(bytes_)
                 ->body);
  }
  const ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayAnon>*
  Unwrap_NEW() const {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<const ::fidl::internal::TransactionalResponse<
                 ::test_protocolpayloads::MainProtocol::TwoWayAnon>*>(bytes_)
                 ->body);
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayAnon>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayAnon>&
  value() const {
    return *Unwrap();
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayAnon>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayAnon>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayAnon>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayAnon>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayAnon>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<::test_protocolpayloads::MainProtocol::TwoWayAnon>&
  operator*() const {
    return value();
  }

 private:
  uint8_t* bytes_;
};
template <>
class [[nodiscard]] ::fidl::WireResult<
    ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>
    final : public ::fidl::Status {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocolpayloads::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>* request);
  WireResult(
      ::fidl::UnownedClientEnd<::test_protocolpayloads::MainProtocol> client,
      ::fidl::internal::TransactionalRequest<
          ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>* request,
      zx_time_t _deadline);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;
  ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<::fidl::WireResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<const ::fidl::WireResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fitx::result<
      uint32_t,
      ::test_protocolpayloads::wire::MainProtocolTwoWayAnonWithErrorResponse*>*
  Unwrap_NEW() {
    return &result_.value();
  }
  const ::fitx::result<
      uint32_t,
      ::test_protocolpayloads::wire::MainProtocolTwoWayAnonWithErrorResponse*>*
  Unwrap_NEW() const {
    return &result_.value();
  }

  ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>&
  value() const {
    return *Unwrap();
  }

  ::fitx::result<
      uint32_t,
      ::test_protocolpayloads::wire::MainProtocolTwoWayAnonWithErrorResponse*>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fitx::result<
      uint32_t,
      ::test_protocolpayloads::wire::MainProtocolTwoWayAnonWithErrorResponse*>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>&
  operator*() const {
    return value();
  }

 private:
  ::fidl::internal::InlineMessageBuffer<48> bytes_;
  std::optional<::fitx::result<
      uint32_t,
      ::test_protocolpayloads::wire::MainProtocolTwoWayAnonWithErrorResponse*>>
      result_ = std::nullopt;
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<
    ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_protocolpayloads::MainProtocol>
          client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<
          ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>* request);
  explicit WireUnownedResult(
      ::fidl::internal::TransactionalResponse<
          ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>* response)
      : bytes_(reinterpret_cast<uint8_t*>(response)) {
    auto* raw_response = reinterpret_cast<::fidl::WireResponse<
        ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>*>(
        bytes_ + sizeof(fidl_message_header_t));
    if (raw_response->result.is_err()) {
      result_ = fitx::error(raw_response->result.err());
    } else {
      result_ = fitx::ok(&(raw_response->result.response()));
    }
  }
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  explicit WireUnownedResult(
      ::fidl::unstable::DecodedMessage<::fidl::internal::TransactionalResponse<
          ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>>&&
          decoded,
      ::fidl::internal::IncomingTransportContext context)
      : ::fidl::Status(decoded) {
    if (decoded.ok()) {
      bytes_ = reinterpret_cast<uint8_t*>(decoded.PrimaryObject());
      auto* raw_response = reinterpret_cast<::fidl::WireResponse<
          ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>*>(
          bytes_ + sizeof(fidl_message_header_t));
      if (raw_response->result.is_err()) {
        result_ = fitx::error(raw_response->result.err());
      } else if (raw_response->result.is_response()) {
        result_ = fitx::ok(&(raw_response->result.response()));
      }
    } else {
      bytes_ = nullptr;
    }
    decoded.ReleasePrimaryObject();
  }
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
  ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<::fidl::internal::TransactionalResponse<
                 ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>*>(
                 bytes_)
                 ->body);
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<const ::fidl::internal::TransactionalResponse<
                 ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>*>(
                 bytes_)
                 ->body);
  }

  ::fitx::result<
      uint32_t,
      ::test_protocolpayloads::wire::MainProtocolTwoWayAnonWithErrorResponse*>*
  Unwrap_NEW() {
    return &result_.value();
  }
  const ::fitx::result<
      uint32_t,
      ::test_protocolpayloads::wire::MainProtocolTwoWayAnonWithErrorResponse*>*
  Unwrap_NEW() const {
    return &result_.value();
  }

  ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>&
  value() const {
    return *Unwrap();
  }

  ::fitx::result<
      uint32_t,
      ::test_protocolpayloads::wire::MainProtocolTwoWayAnonWithErrorResponse*>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fitx::result<
      uint32_t,
      ::test_protocolpayloads::wire::MainProtocolTwoWayAnonWithErrorResponse*>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>&
  operator*() const {
    return value();
  }

 private:
  uint8_t* bytes_;
  std::optional<::fitx::result<
      uint32_t,
      ::test_protocolpayloads::wire::MainProtocolTwoWayAnonWithErrorResponse*>>
      result_ = std::nullopt;
};
template <>
class ::fidl::internal::WireEventHandlerInterface<
    ::test_protocolpayloads::MainProtocol> {
 public:
  WireEventHandlerInterface() = default;
  virtual ~WireEventHandlerInterface() = default;
  virtual void OnComposed(
      ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnComposed>*
          event) = 0;
  virtual void OnComposedWithError(
      ::fidl::WireEvent<
          ::test_protocolpayloads::MainProtocol::OnComposedWithError>*
          event) = 0;
  virtual void OnLocal(
      ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnLocal>*
          event) = 0;
  virtual void OnLocalWithError(
      ::fidl::WireEvent<
          ::test_protocolpayloads::MainProtocol::OnLocalWithError>* event) = 0;
  virtual void OnImport(
      ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnImport>*
          event) = 0;
  virtual void OnImportWithError(
      ::fidl::WireEvent<
          ::test_protocolpayloads::MainProtocol::OnImportWithError>* event) = 0;
  virtual void OnAnon(
      ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnAnon>*
          event) = 0;
  virtual void OnAnonWithError(
      ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnAnonWithError>*
          event) = 0;
};

template <>
class ::fidl::WireAsyncEventHandler<::test_protocolpayloads::MainProtocol>
    : public ::fidl::internal::WireEventHandlerInterface<
          ::test_protocolpayloads::MainProtocol>,
      public ::fidl::internal::AsyncEventHandler {
 public:
  WireAsyncEventHandler() = default;
  void OnComposed(
      ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnComposed>*
          event) override {}
  void OnComposedWithError(
      ::fidl::WireEvent<
          ::test_protocolpayloads::MainProtocol::OnComposedWithError>* event)
      override {}
  void OnLocal(
      ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnLocal>* event)
      override {}
  void OnLocalWithError(
      ::fidl::WireEvent<
          ::test_protocolpayloads::MainProtocol::OnLocalWithError>* event)
      override {}
  void OnImport(
      ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnImport>* event)
      override {}
  void OnImportWithError(
      ::fidl::WireEvent<
          ::test_protocolpayloads::MainProtocol::OnImportWithError>* event)
      override {}
  void OnAnon(::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnAnon>*
                  event) override {}
  void OnAnonWithError(
      ::fidl::WireEvent<::test_protocolpayloads::MainProtocol::OnAnonWithError>*
          event) override {}
};

template <>
class ::fidl::WireSyncEventHandler<::test_protocolpayloads::MainProtocol>
    : public ::fidl::internal::WireEventHandlerInterface<
          ::test_protocolpayloads::MainProtocol> {
 public:
  WireSyncEventHandler() = default;

  // Handle all possible events defined in this protocol.
  // Blocks to consume exactly one message from the channel, then call the
  // corresponding virtual method.
  ::fidl::Status HandleOneEvent(
      ::fidl::UnownedClientEnd<::test_protocolpayloads::MainProtocol>
          client_end);

 private:
  [[maybe_unused]] bool got_transitional_ = false;
};

template <>
class ::fidl::internal::WireEventDispatcher<
    ::test_protocolpayloads::MainProtocol>
    final : public ::fidl::internal::IncomingEventDispatcher<
                ::fidl::WireAsyncEventHandler<
                    ::test_protocolpayloads::MainProtocol>> {
 public:
  explicit WireEventDispatcher(
      ::fidl::WireAsyncEventHandler<::test_protocolpayloads::MainProtocol>*
          event_handler)
      : IncomingEventDispatcher(event_handler) {}

 private:
  std::optional<::fidl::UnbindInfo> DispatchEvent(
      ::fidl::IncomingMessage& msg,
      ::fidl::internal::IncomingTransportContext transport_context) override;
};

// Methods to make a sync FIDL call directly on an unowned handle or a
// const reference to a
// |fidl::ClientEnd<::test_protocolpayloads::MainProtocol>|, avoiding setting up
// a client.
template <>
class ::fidl::internal::WireSyncClientImpl<
    ::test_protocolpayloads::MainProtocol>
    final : public ::fidl::internal::SyncEndpointManagedVeneer<
                ::fidl::internal::WireSyncClientImpl<
                    ::test_protocolpayloads::MainProtocol>> {
 public:
  // Allocates 40 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<::test_protocolpayloads::MainProtocol::OneWayComposed>
  OneWayComposed(int32_t a) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocolpayloads::MainProtocol::OneWayComposed>
        _request{a};
    return ::fidl::WireResult<
        ::test_protocolpayloads::MainProtocol::OneWayComposed>(_client_end(),
                                                               &_request);
  }

  // Allocates 48 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<::test_protocolpayloads::MainProtocol::TwoWayComposed>
  TwoWayComposed(int32_t a) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocolpayloads::MainProtocol::TwoWayComposed>
        _request{a};
    return ::fidl::WireResult<
        ::test_protocolpayloads::MainProtocol::TwoWayComposed>(_client_end(),
                                                               &_request);
  }

  // Allocates 56 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<
      ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>
  TwoWayComposedWithError(int32_t a) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>
        _request{a};
    return ::fidl::WireResult<
        ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>(
        _client_end(), &_request);
  }

  // Allocates 40 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<::test_protocolpayloads::MainProtocol::OneWayLocal>
  OneWayLocal(uint32_t a, uint32_t b) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocolpayloads::MainProtocol::OneWayLocal>
        _request{a, b};
    return ::fidl::WireResult<
        ::test_protocolpayloads::MainProtocol::OneWayLocal>(_client_end(),
                                                            &_request);
  }

  // Allocates 48 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<::test_protocolpayloads::MainProtocol::TwoWayLocal>
  TwoWayLocal(uint32_t a, uint32_t b) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocolpayloads::MainProtocol::TwoWayLocal>
        _request{a, b};
    return ::fidl::WireResult<
        ::test_protocolpayloads::MainProtocol::TwoWayLocal>(_client_end(),
                                                            &_request);
  }

  // Allocates 64 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<
      ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>
  TwoWayLocalWithError(uint32_t a, uint32_t b) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>
        _request{a, b};
    return ::fidl::WireResult<
        ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>(
        _client_end(), &_request);
  }

  // Allocates 40 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<::test_protocolpayloads::MainProtocol::OneWayImport>
  OneWayImport(int32_t a) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocolpayloads::MainProtocol::OneWayImport>
        _request{a};
    return ::fidl::WireResult<
        ::test_protocolpayloads::MainProtocol::OneWayImport>(_client_end(),
                                                             &_request);
  }

  // Allocates 48 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<::test_protocolpayloads::MainProtocol::TwoWayImport>
  TwoWayImport(int32_t a) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocolpayloads::MainProtocol::TwoWayImport>
        _request{a};
    return ::fidl::WireResult<
        ::test_protocolpayloads::MainProtocol::TwoWayImport>(_client_end(),
                                                             &_request);
  }

  // Allocates 56 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<
      ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>
  TwoWayImportWithError(int32_t a) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>
        _request{a};
    return ::fidl::WireResult<
        ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>(
        _client_end(), &_request);
  }

  // Allocates 40 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<::test_protocolpayloads::MainProtocol::OneWayAnon>
  OneWayAnon(uint32_t a, uint32_t b) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocolpayloads::MainProtocol::OneWayAnon>
        _request{a, b};
    return ::fidl::WireResult<
        ::test_protocolpayloads::MainProtocol::OneWayAnon>(_client_end(),
                                                           &_request);
  }

  // Allocates 48 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<::test_protocolpayloads::MainProtocol::TwoWayAnon>
  TwoWayAnon(uint32_t a, uint32_t b) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocolpayloads::MainProtocol::TwoWayAnon>
        _request{a, b};
    return ::fidl::WireResult<
        ::test_protocolpayloads::MainProtocol::TwoWayAnon>(_client_end(),
                                                           &_request);
  }

  // Allocates 64 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>
  TwoWayAnonWithError(uint32_t a, uint32_t b) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>
        _request{a, b};
    return ::fidl::WireResult<
        ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>(
        _client_end(), &_request);
  }

 private:
  ::fidl::UnownedClientEnd<::test_protocolpayloads::MainProtocol> _client_end()
      const {
    return ::fidl::UnownedClientEnd<::test_protocolpayloads::MainProtocol>(
        _transport().get<::fidl::internal::ChannelTransport>());
  }
};

template <>
class ::fidl::internal::WireSyncBufferClientImpl<
    ::test_protocolpayloads::MainProtocol>
    final : public ::fidl::internal::SyncEndpointBufferVeneer<
                ::fidl::internal::WireSyncBufferClientImpl<
                    ::test_protocolpayloads::MainProtocol>> {
 public:
  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<
      ::test_protocolpayloads::MainProtocol::OneWayComposed>
  OneWayComposed(int32_t a) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocolpayloads::MainProtocol::OneWayComposed>
        _request{a};
    return ::fidl::WireUnownedResult<
        ::test_protocolpayloads::MainProtocol::OneWayComposed>(
        _client_end(), _allocator(), &_request);
  }

  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<
      ::test_protocolpayloads::MainProtocol::TwoWayComposed>
  TwoWayComposed(int32_t a) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocolpayloads::MainProtocol::TwoWayComposed>
        _request{a};
    return ::fidl::WireUnownedResult<
        ::test_protocolpayloads::MainProtocol::TwoWayComposed>(
        _client_end(), _allocator(), &_request);
  }

  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<
      ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>
  TwoWayComposedWithError(int32_t a) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>
        _request{a};
    return ::fidl::WireUnownedResult<
        ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>(
        _client_end(), _allocator(), &_request);
  }

  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<::test_protocolpayloads::MainProtocol::OneWayLocal>
  OneWayLocal(uint32_t a, uint32_t b) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocolpayloads::MainProtocol::OneWayLocal>
        _request{a, b};
    return ::fidl::WireUnownedResult<
        ::test_protocolpayloads::MainProtocol::OneWayLocal>(
        _client_end(), _allocator(), &_request);
  }

  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<::test_protocolpayloads::MainProtocol::TwoWayLocal>
  TwoWayLocal(uint32_t a, uint32_t b) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocolpayloads::MainProtocol::TwoWayLocal>
        _request{a, b};
    return ::fidl::WireUnownedResult<
        ::test_protocolpayloads::MainProtocol::TwoWayLocal>(
        _client_end(), _allocator(), &_request);
  }

  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<
      ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>
  TwoWayLocalWithError(uint32_t a, uint32_t b) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>
        _request{a, b};
    return ::fidl::WireUnownedResult<
        ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>(
        _client_end(), _allocator(), &_request);
  }

  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<::test_protocolpayloads::MainProtocol::OneWayImport>
  OneWayImport(int32_t a) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocolpayloads::MainProtocol::OneWayImport>
        _request{a};
    return ::fidl::WireUnownedResult<
        ::test_protocolpayloads::MainProtocol::OneWayImport>(
        _client_end(), _allocator(), &_request);
  }

  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<::test_protocolpayloads::MainProtocol::TwoWayImport>
  TwoWayImport(int32_t a) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocolpayloads::MainProtocol::TwoWayImport>
        _request{a};
    return ::fidl::WireUnownedResult<
        ::test_protocolpayloads::MainProtocol::TwoWayImport>(
        _client_end(), _allocator(), &_request);
  }

  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<
      ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>
  TwoWayImportWithError(int32_t a) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>
        _request{a};
    return ::fidl::WireUnownedResult<
        ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>(
        _client_end(), _allocator(), &_request);
  }

  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<::test_protocolpayloads::MainProtocol::OneWayAnon>
  OneWayAnon(uint32_t a, uint32_t b) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocolpayloads::MainProtocol::OneWayAnon>
        _request{a, b};
    return ::fidl::WireUnownedResult<
        ::test_protocolpayloads::MainProtocol::OneWayAnon>(
        _client_end(), _allocator(), &_request);
  }

  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<::test_protocolpayloads::MainProtocol::TwoWayAnon>
  TwoWayAnon(uint32_t a, uint32_t b) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocolpayloads::MainProtocol::TwoWayAnon>
        _request{a, b};
    return ::fidl::WireUnownedResult<
        ::test_protocolpayloads::MainProtocol::TwoWayAnon>(
        _client_end(), _allocator(), &_request);
  }

  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<
      ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>
  TwoWayAnonWithError(uint32_t a, uint32_t b) {
    ::fidl::internal::TransactionalRequest<
        ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>
        _request{a, b};
    return ::fidl::WireUnownedResult<
        ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>(
        _client_end(), _allocator(), &_request);
  }

 private:
  ::fidl::UnownedClientEnd<::test_protocolpayloads::MainProtocol> _client_end()
      const {
    return ::fidl::UnownedClientEnd<::test_protocolpayloads::MainProtocol>(
        _transport().get<::fidl::internal::ChannelTransport>());
  }
};

template <>
class ::fidl::internal::WireCompleterImpl<
    ::test_protocolpayloads::MainProtocol::TwoWayComposed>
    : public ::fidl::internal::CompleterImplBase<
          ::test_protocolpayloads::MainProtocol::TwoWayComposed> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(int32_t a);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<
    ::test_protocolpayloads::MainProtocol::TwoWayComposed>
    : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(int32_t a);
};

template <>
class ::fidl::internal::WireCompleterBase<
    ::test_protocolpayloads::MainProtocol::TwoWayComposed>
    : public ::fidl::CompleterBase,
      public ::fidl::internal::WireCompleterImpl<
          ::test_protocolpayloads::MainProtocol::TwoWayComposed> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned,
                    bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};

template <>
class ::fidl::internal::WireCompleterImpl<
    ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>
    : public ::fidl::internal::CompleterImplBase<
          ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(::test_protocolpayloads_imported::wire::
                 ComposedProtocolTwoWayComposedWithErrorResult result);
  void ReplySuccess(int32_t a);
  void ReplyError(uint32_t error);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<
    ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>
    : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(::test_protocolpayloads_imported::wire::
                 ComposedProtocolTwoWayComposedWithErrorResult result);
  void ReplySuccess(int32_t a);
  void ReplyError(uint32_t error);
};

template <>
class ::fidl::internal::WireCompleterBase<
    ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>
    : public ::fidl::CompleterBase,
      public ::fidl::internal::WireCompleterImpl<
          ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned,
                    bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};

template <>
class ::fidl::internal::WireCompleterImpl<
    ::test_protocolpayloads::MainProtocol::TwoWayLocal>
    : public ::fidl::internal::CompleterImplBase<
          ::test_protocolpayloads::MainProtocol::TwoWayLocal> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(uint32_t a, uint32_t b);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<
    ::test_protocolpayloads::MainProtocol::TwoWayLocal>
    : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(uint32_t a, uint32_t b);
};

template <>
class ::fidl::internal::WireCompleterBase<
    ::test_protocolpayloads::MainProtocol::TwoWayLocal>
    : public ::fidl::CompleterBase,
      public ::fidl::internal::WireCompleterImpl<
          ::test_protocolpayloads::MainProtocol::TwoWayLocal> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned,
                    bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};

template <>
class ::fidl::internal::WireCompleterImpl<
    ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>
    : public ::fidl::internal::CompleterImplBase<
          ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(
      ::test_protocolpayloads::wire::MainProtocolTwoWayLocalWithErrorResult
          result);
  void ReplySuccess(uint32_t a, uint32_t b);
  void ReplyError(uint32_t error);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<
    ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>
    : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(
      ::test_protocolpayloads::wire::MainProtocolTwoWayLocalWithErrorResult
          result);
  void ReplySuccess(uint32_t a, uint32_t b);
  void ReplyError(uint32_t error);
};

template <>
class ::fidl::internal::WireCompleterBase<
    ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>
    : public ::fidl::CompleterBase,
      public ::fidl::internal::WireCompleterImpl<
          ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned,
                    bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};

template <>
class ::fidl::internal::WireCompleterImpl<
    ::test_protocolpayloads::MainProtocol::TwoWayImport>
    : public ::fidl::internal::CompleterImplBase<
          ::test_protocolpayloads::MainProtocol::TwoWayImport> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(int32_t a);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<
    ::test_protocolpayloads::MainProtocol::TwoWayImport>
    : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(int32_t a);
};

template <>
class ::fidl::internal::WireCompleterBase<
    ::test_protocolpayloads::MainProtocol::TwoWayImport>
    : public ::fidl::CompleterBase,
      public ::fidl::internal::WireCompleterImpl<
          ::test_protocolpayloads::MainProtocol::TwoWayImport> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned,
                    bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};

template <>
class ::fidl::internal::WireCompleterImpl<
    ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>
    : public ::fidl::internal::CompleterImplBase<
          ::test_protocolpayloads::MainProtocol::TwoWayImportWithError> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(
      ::test_protocolpayloads::wire::MainProtocolTwoWayImportWithErrorResult
          result);
  void ReplySuccess(int32_t a);
  void ReplyError(uint32_t error);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<
    ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>
    : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(
      ::test_protocolpayloads::wire::MainProtocolTwoWayImportWithErrorResult
          result);
  void ReplySuccess(int32_t a);
  void ReplyError(uint32_t error);
};

template <>
class ::fidl::internal::WireCompleterBase<
    ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>
    : public ::fidl::CompleterBase,
      public ::fidl::internal::WireCompleterImpl<
          ::test_protocolpayloads::MainProtocol::TwoWayImportWithError> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned,
                    bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};

template <>
class ::fidl::internal::WireCompleterImpl<
    ::test_protocolpayloads::MainProtocol::TwoWayAnon>
    : public ::fidl::internal::CompleterImplBase<
          ::test_protocolpayloads::MainProtocol::TwoWayAnon> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(uint32_t a, uint32_t b);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<
    ::test_protocolpayloads::MainProtocol::TwoWayAnon>
    : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(uint32_t a, uint32_t b);
};

template <>
class ::fidl::internal::WireCompleterBase<
    ::test_protocolpayloads::MainProtocol::TwoWayAnon>
    : public ::fidl::CompleterBase,
      public ::fidl::internal::WireCompleterImpl<
          ::test_protocolpayloads::MainProtocol::TwoWayAnon> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned,
                    bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};

template <>
class ::fidl::internal::WireCompleterImpl<
    ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>
    : public ::fidl::internal::CompleterImplBase<
          ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(
      ::test_protocolpayloads::wire::MainProtocolTwoWayAnonWithErrorResult
          result);
  void ReplySuccess(uint32_t a, uint32_t b);
  void ReplyError(uint32_t error);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<
    ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>
    : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(
      ::test_protocolpayloads::wire::MainProtocolTwoWayAnonWithErrorResult
          result);
  void ReplySuccess(uint32_t a, uint32_t b);
  void ReplyError(uint32_t error);
};

template <>
class ::fidl::internal::WireCompleterBase<
    ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>
    : public ::fidl::CompleterBase,
      public ::fidl::internal::WireCompleterImpl<
          ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned,
                    bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};

// Pure-virtual interface to be implemented by a server.
// This interface uses typed channels (i.e. |fidl::ClientEnd<SomeProtocol>|
// and |fidl::ServerEnd<SomeProtocol>|).
template <>
class ::fidl::WireServer<::test_protocolpayloads::MainProtocol>
    : public ::fidl::internal::IncomingMessageDispatcher {
 public:
  WireServer() = default;
  virtual ~WireServer() = default;

  // The FIDL protocol type that is implemented by this server.
  using _EnclosingProtocol = ::test_protocolpayloads::MainProtocol;

  using OneWayComposedCompleter = ::fidl::internal::WireCompleter<
      ::test_protocolpayloads::MainProtocol::OneWayComposed>;
  using OneWayComposedRequestView = ::fidl::internal::WireRequestView<
      ::test_protocolpayloads::MainProtocol::OneWayComposed>;

  virtual void OneWayComposed(OneWayComposedRequestView request,
                              OneWayComposedCompleter::Sync& completer) = 0;

  using TwoWayComposedCompleter = ::fidl::internal::WireCompleter<
      ::test_protocolpayloads::MainProtocol::TwoWayComposed>;
  using TwoWayComposedRequestView = ::fidl::internal::WireRequestView<
      ::test_protocolpayloads::MainProtocol::TwoWayComposed>;

  virtual void TwoWayComposed(TwoWayComposedRequestView request,
                              TwoWayComposedCompleter::Sync& completer) = 0;

  using TwoWayComposedWithErrorCompleter = ::fidl::internal::WireCompleter<
      ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>;
  using TwoWayComposedWithErrorRequestView = ::fidl::internal::WireRequestView<
      ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>;

  virtual void TwoWayComposedWithError(
      TwoWayComposedWithErrorRequestView request,
      TwoWayComposedWithErrorCompleter::Sync& completer) = 0;

  using OneWayLocalCompleter = ::fidl::internal::WireCompleter<
      ::test_protocolpayloads::MainProtocol::OneWayLocal>;
  using OneWayLocalRequestView = ::fidl::internal::WireRequestView<
      ::test_protocolpayloads::MainProtocol::OneWayLocal>;

  virtual void OneWayLocal(OneWayLocalRequestView request,
                           OneWayLocalCompleter::Sync& completer) = 0;

  using TwoWayLocalCompleter = ::fidl::internal::WireCompleter<
      ::test_protocolpayloads::MainProtocol::TwoWayLocal>;
  using TwoWayLocalRequestView = ::fidl::internal::WireRequestView<
      ::test_protocolpayloads::MainProtocol::TwoWayLocal>;

  virtual void TwoWayLocal(TwoWayLocalRequestView request,
                           TwoWayLocalCompleter::Sync& completer) = 0;

  using TwoWayLocalWithErrorCompleter = ::fidl::internal::WireCompleter<
      ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>;
  using TwoWayLocalWithErrorRequestView = ::fidl::internal::WireRequestView<
      ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>;

  virtual void TwoWayLocalWithError(
      TwoWayLocalWithErrorRequestView request,
      TwoWayLocalWithErrorCompleter::Sync& completer) = 0;

  using OneWayImportCompleter = ::fidl::internal::WireCompleter<
      ::test_protocolpayloads::MainProtocol::OneWayImport>;
  using OneWayImportRequestView = ::fidl::internal::WireRequestView<
      ::test_protocolpayloads::MainProtocol::OneWayImport>;

  virtual void OneWayImport(OneWayImportRequestView request,
                            OneWayImportCompleter::Sync& completer) = 0;

  using TwoWayImportCompleter = ::fidl::internal::WireCompleter<
      ::test_protocolpayloads::MainProtocol::TwoWayImport>;
  using TwoWayImportRequestView = ::fidl::internal::WireRequestView<
      ::test_protocolpayloads::MainProtocol::TwoWayImport>;

  virtual void TwoWayImport(TwoWayImportRequestView request,
                            TwoWayImportCompleter::Sync& completer) = 0;

  using TwoWayImportWithErrorCompleter = ::fidl::internal::WireCompleter<
      ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>;
  using TwoWayImportWithErrorRequestView = ::fidl::internal::WireRequestView<
      ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>;

  virtual void TwoWayImportWithError(
      TwoWayImportWithErrorRequestView request,
      TwoWayImportWithErrorCompleter::Sync& completer) = 0;

  using OneWayAnonCompleter = ::fidl::internal::WireCompleter<
      ::test_protocolpayloads::MainProtocol::OneWayAnon>;
  using OneWayAnonRequestView = ::fidl::internal::WireRequestView<
      ::test_protocolpayloads::MainProtocol::OneWayAnon>;

  virtual void OneWayAnon(OneWayAnonRequestView request,
                          OneWayAnonCompleter::Sync& completer) = 0;

  using TwoWayAnonCompleter = ::fidl::internal::WireCompleter<
      ::test_protocolpayloads::MainProtocol::TwoWayAnon>;
  using TwoWayAnonRequestView = ::fidl::internal::WireRequestView<
      ::test_protocolpayloads::MainProtocol::TwoWayAnon>;

  virtual void TwoWayAnon(TwoWayAnonRequestView request,
                          TwoWayAnonCompleter::Sync& completer) = 0;

  using TwoWayAnonWithErrorCompleter = ::fidl::internal::WireCompleter<
      ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>;
  using TwoWayAnonWithErrorRequestView = ::fidl::internal::WireRequestView<
      ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>;

  virtual void TwoWayAnonWithError(
      TwoWayAnonWithErrorRequestView request,
      TwoWayAnonWithErrorCompleter::Sync& completer) = 0;

 private:
  void dispatch_message(
      ::fidl::IncomingMessage&& msg, ::fidl::Transaction* txn,
      ::fidl::internal::IncomingTransportContext transport_context) final;
};
namespace test_protocolpayloads {
#endif  // __Fuchsia__

}  // namespace test_protocolpayloads
namespace fidl {

#ifdef __Fuchsia__
}  // namespace fidl
template <>
class ::fidl::internal::WireWeakOnewayClientImpl<
    ::test_protocolpayloads::MainProtocol>
    : public ::fidl::internal::ClientImplBase {
 public:
  using ClientImplBase::ClientImplBase;

  // Allocates 40 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::Status OneWayComposed(int32_t a);

  // Allocates 40 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::Status OneWayLocal(uint32_t a, uint32_t b);

  // Allocates 40 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::Status OneWayImport(int32_t a);

  // Allocates 40 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::Status OneWayAnon(uint32_t a, uint32_t b);
};

template <>
class ::fidl::internal::WireWeakAsyncClientImpl<
    ::test_protocolpayloads::MainProtocol>
    final : public ::fidl::internal::WireWeakOnewayClientImpl<
                ::test_protocolpayloads::MainProtocol> {
 public:
  using WireWeakOnewayClientImpl::WireWeakOnewayClientImpl;
  // Allocates 24 bytes of request buffer on the stack. The callback is stored
  // on the heap.
  ::fidl::internal::WireThenable<
      ::test_protocolpayloads::MainProtocol::TwoWayComposed>
  TwoWayComposed(int32_t a);
  // Allocates 24 bytes of request buffer on the stack. The callback is stored
  // on the heap.
  ::fidl::internal::WireThenable<
      ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>
  TwoWayComposedWithError(int32_t a);
  // Allocates 24 bytes of request buffer on the stack. The callback is stored
  // on the heap.
  ::fidl::internal::WireThenable<
      ::test_protocolpayloads::MainProtocol::TwoWayLocal>
  TwoWayLocal(uint32_t a, uint32_t b);
  // Allocates 24 bytes of request buffer on the stack. The callback is stored
  // on the heap.
  ::fidl::internal::WireThenable<
      ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>
  TwoWayLocalWithError(uint32_t a, uint32_t b);
  // Allocates 24 bytes of request buffer on the stack. The callback is stored
  // on the heap.
  ::fidl::internal::WireThenable<
      ::test_protocolpayloads::MainProtocol::TwoWayImport>
  TwoWayImport(int32_t a);
  // Allocates 24 bytes of request buffer on the stack. The callback is stored
  // on the heap.
  ::fidl::internal::WireThenable<
      ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>
  TwoWayImportWithError(int32_t a);
  // Allocates 24 bytes of request buffer on the stack. The callback is stored
  // on the heap.
  ::fidl::internal::WireThenable<
      ::test_protocolpayloads::MainProtocol::TwoWayAnon>
  TwoWayAnon(uint32_t a, uint32_t b);
  // Allocates 24 bytes of request buffer on the stack. The callback is stored
  // on the heap.
  ::fidl::internal::WireThenable<
      ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>
  TwoWayAnonWithError(uint32_t a, uint32_t b);
};

template <>
class ::fidl::internal::WireWeakOnewayBufferClientImpl<
    ::test_protocolpayloads::MainProtocol>
    : public ::fidl::internal::BufferClientImplBase {
 public:
  using BufferClientImplBase::BufferClientImplBase;

  // Caller provides the backing storage for FIDL message.
  ::fidl::Status OneWayComposed(int32_t a);

  // Caller provides the backing storage for FIDL message.
  ::fidl::Status OneWayLocal(uint32_t a, uint32_t b);

  // Caller provides the backing storage for FIDL message.
  ::fidl::Status OneWayImport(int32_t a);

  // Caller provides the backing storage for FIDL message.
  ::fidl::Status OneWayAnon(uint32_t a, uint32_t b);
};

template <>
class ::fidl::internal::WireWeakAsyncBufferClientImpl<
    ::test_protocolpayloads::MainProtocol>
    final : public ::fidl::internal::WireWeakOnewayBufferClientImpl<
                ::test_protocolpayloads::MainProtocol> {
 public:
  using WireWeakOnewayBufferClientImpl::WireWeakOnewayBufferClientImpl;

  // Caller provides the backing storage for FIDL message.
  ::fidl::internal::WireBufferThenable<
      ::test_protocolpayloads::MainProtocol::TwoWayComposed>
  TwoWayComposed(int32_t a);

  // Caller provides the backing storage for FIDL message.
  ::fidl::internal::WireBufferThenable<
      ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>
  TwoWayComposedWithError(int32_t a);

  // Caller provides the backing storage for FIDL message.
  ::fidl::internal::WireBufferThenable<
      ::test_protocolpayloads::MainProtocol::TwoWayLocal>
  TwoWayLocal(uint32_t a, uint32_t b);

  // Caller provides the backing storage for FIDL message.
  ::fidl::internal::WireBufferThenable<
      ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>
  TwoWayLocalWithError(uint32_t a, uint32_t b);

  // Caller provides the backing storage for FIDL message.
  ::fidl::internal::WireBufferThenable<
      ::test_protocolpayloads::MainProtocol::TwoWayImport>
  TwoWayImport(int32_t a);

  // Caller provides the backing storage for FIDL message.
  ::fidl::internal::WireBufferThenable<
      ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>
  TwoWayImportWithError(int32_t a);

  // Caller provides the backing storage for FIDL message.
  ::fidl::internal::WireBufferThenable<
      ::test_protocolpayloads::MainProtocol::TwoWayAnon>
  TwoWayAnon(uint32_t a, uint32_t b);

  // Caller provides the backing storage for FIDL message.
  ::fidl::internal::WireBufferThenable<
      ::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>
  TwoWayAnonWithError(uint32_t a, uint32_t b);
};
template <>
class ::fidl::internal::WireWeakSyncClientImpl<
    ::test_protocolpayloads::MainProtocol>
    final : public ::fidl::internal::WireWeakOnewayClientImpl<
                ::test_protocolpayloads::MainProtocol> {
 public:
  using WireWeakOnewayClientImpl::WireWeakOnewayClientImpl;

  // Allocates 48 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<::test_protocolpayloads::MainProtocol::TwoWayComposed>
  TwoWayComposed(int32_t a);

  // Allocates 56 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<
      ::test_protocolpayloads::MainProtocol::TwoWayComposedWithError>
  TwoWayComposedWithError(int32_t a);

  // Allocates 48 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<::test_protocolpayloads::MainProtocol::TwoWayLocal>
  TwoWayLocal(uint32_t a, uint32_t b);

  // Allocates 64 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<
      ::test_protocolpayloads::MainProtocol::TwoWayLocalWithError>
  TwoWayLocalWithError(uint32_t a, uint32_t b);

  // Allocates 48 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<::test_protocolpayloads::MainProtocol::TwoWayImport>
  TwoWayImport(int32_t a);

  // Allocates 56 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<
      ::test_protocolpayloads::MainProtocol::TwoWayImportWithError>
  TwoWayImportWithError(int32_t a);

  // Allocates 48 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<::test_protocolpayloads::MainProtocol::TwoWayAnon>
  TwoWayAnon(uint32_t a, uint32_t b);

  // Allocates 64 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<::test_protocolpayloads::MainProtocol::TwoWayAnonWithError>
  TwoWayAnonWithError(uint32_t a, uint32_t b);
};
namespace fidl {
#endif  // __Fuchsia__

}  // namespace fidl
#ifdef __Fuchsia__
template <>
class ::fidl::internal::WireWeakEventSender<
    ::test_protocolpayloads::MainProtocol>
    : public ::fidl::internal::WeakEventSenderBase {
 public:
  using WeakEventSenderBase::WeakEventSenderBase;

  fidl::Status OnComposed(int32_t a);

  fidl::Status OnComposedWithError(
      ::test_protocolpayloads_imported::wire::
          ComposedProtocolOnComposedWithErrorResult result);

  fidl::Status OnLocal(uint32_t a, uint32_t b);

  fidl::Status OnLocalWithError(
      ::test_protocolpayloads::wire::MainProtocolOnLocalWithErrorResult result);

  fidl::Status OnImport(int32_t a);

  fidl::Status OnImportWithError(
      ::test_protocolpayloads::wire::MainProtocolOnImportWithErrorResult
          result);

  fidl::Status OnAnon(uint32_t a, uint32_t b);

  fidl::Status OnAnonWithError(
      ::test_protocolpayloads::wire::MainProtocolOnAnonWithErrorResult result);
};

template <>
class ::fidl::internal::WireWeakBufferEventSender<
    ::test_protocolpayloads::MainProtocol>
    : public ::fidl::internal::WeakBufferEventSenderBase {
 public:
  using WeakBufferEventSenderBase::WeakBufferEventSenderBase;

  fidl::Status OnComposed(int32_t a);

  fidl::Status OnComposedWithError(
      ::test_protocolpayloads_imported::wire::
          ComposedProtocolOnComposedWithErrorResult result);

  fidl::Status OnLocal(uint32_t a, uint32_t b);

  fidl::Status OnLocalWithError(
      ::test_protocolpayloads::wire::MainProtocolOnLocalWithErrorResult result);

  fidl::Status OnImport(int32_t a);

  fidl::Status OnImportWithError(
      ::test_protocolpayloads::wire::MainProtocolOnImportWithErrorResult
          result);

  fidl::Status OnAnon(uint32_t a, uint32_t b);

  fidl::Status OnAnonWithError(
      ::test_protocolpayloads::wire::MainProtocolOnAnonWithErrorResult result);
};

template <>
class ::fidl::internal::WireEventSender<::test_protocolpayloads::MainProtocol>
    : public ::fidl::internal::SyncEndpointManagedVeneer<
          ::fidl::internal::WireEventSender<
              ::test_protocolpayloads::MainProtocol>> {
 public:
  using SyncEndpointManagedVeneer::SyncEndpointManagedVeneer;

  fidl::Status OnComposed(int32_t a);

  fidl::Status OnComposedWithError(
      ::test_protocolpayloads_imported::wire::
          ComposedProtocolOnComposedWithErrorResult result);

  fidl::Status OnLocal(uint32_t a, uint32_t b);

  fidl::Status OnLocalWithError(
      ::test_protocolpayloads::wire::MainProtocolOnLocalWithErrorResult result);

  fidl::Status OnImport(int32_t a);

  fidl::Status OnImportWithError(
      ::test_protocolpayloads::wire::MainProtocolOnImportWithErrorResult
          result);

  fidl::Status OnAnon(uint32_t a, uint32_t b);

  fidl::Status OnAnonWithError(
      ::test_protocolpayloads::wire::MainProtocolOnAnonWithErrorResult result);
};

template <>
class ::fidl::internal::WireBufferEventSender<
    ::test_protocolpayloads::MainProtocol>
    : public ::fidl::internal::SyncEndpointBufferVeneer<
          ::fidl::internal::WireBufferEventSender<
              ::test_protocolpayloads::MainProtocol>> {
 public:
  using SyncEndpointBufferVeneer::SyncEndpointBufferVeneer;

  fidl::Status OnComposed(int32_t a);

  fidl::Status OnComposedWithError(
      ::test_protocolpayloads_imported::wire::
          ComposedProtocolOnComposedWithErrorResult result);

  fidl::Status OnLocal(uint32_t a, uint32_t b);

  fidl::Status OnLocalWithError(
      ::test_protocolpayloads::wire::MainProtocolOnLocalWithErrorResult result);

  fidl::Status OnImport(int32_t a);

  fidl::Status OnImportWithError(
      ::test_protocolpayloads::wire::MainProtocolOnImportWithErrorResult
          result);

  fidl::Status OnAnon(uint32_t a, uint32_t b);

  fidl::Status OnAnonWithError(
      ::test_protocolpayloads::wire::MainProtocolOnAnonWithErrorResult result);
};
#endif  // __Fuchsia__
