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

// fidl_experiment = output_index_json



#include <lib/fidl/cpp/wire/unknown_interactions.h>

#include <fidl/test.unknowninteractions/cpp/natural_messaging.h>

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshadow"


namespace test_unknowninteractions {

[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsProtocol_StrictOneWay_Ordinal = 5652707722400962470lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsProtocol_StrictOneWay_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsProtocol_FlexibleOneWay_Ordinal = 583422011583300678lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsProtocol_FlexibleOneWay_DynamicFlags = ::fidl::MessageDynamicFlags::kFlexibleMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsProtocol_StrictTwoWay_Ordinal = 8308184097687583042lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsProtocol_StrictTwoWay_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsProtocol_StrictTwoWayFields_Ordinal = 3697260130745060067lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsProtocol_StrictTwoWayFields_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsProtocol_StrictTwoWayUnion_Ordinal = 2455165891480464557lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsProtocol_StrictTwoWayUnion_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsProtocol_StrictTwoWayTable_Ordinal = 8389853739594228663lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsProtocol_StrictTwoWayTable_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsProtocol_StrictTwoWayErr_Ordinal = 7862264614495172967lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsProtocol_StrictTwoWayErr_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsProtocol_StrictTwoWayFieldsErr_Ordinal = 2414673307948662059lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsProtocol_StrictTwoWayFieldsErr_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsProtocol_StrictTwoWayUnionErr_Ordinal = 4988571416540160202lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsProtocol_StrictTwoWayUnionErr_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsProtocol_StrictTwoWayTableErr_Ordinal = 5487292735562672344lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsProtocol_StrictTwoWayTableErr_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsProtocol_FlexibleTwoWay_Ordinal = 334879577560091516lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsProtocol_FlexibleTwoWay_DynamicFlags = ::fidl::MessageDynamicFlags::kFlexibleMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsProtocol_FlexibleTwoWayFields_Ordinal = 4257018954691721778lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsProtocol_FlexibleTwoWayFields_DynamicFlags = ::fidl::MessageDynamicFlags::kFlexibleMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsProtocol_FlexibleTwoWayUnion_Ordinal = 4913460516188409782lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsProtocol_FlexibleTwoWayUnion_DynamicFlags = ::fidl::MessageDynamicFlags::kFlexibleMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsProtocol_FlexibleTwoWayTable_Ordinal = 9171907422498283911lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsProtocol_FlexibleTwoWayTable_DynamicFlags = ::fidl::MessageDynamicFlags::kFlexibleMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsProtocol_FlexibleTwoWayErr_Ordinal = 6999736795697216519lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsProtocol_FlexibleTwoWayErr_DynamicFlags = ::fidl::MessageDynamicFlags::kFlexibleMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsProtocol_FlexibleTwoWayFieldsErr_Ordinal = 1093132337162001157lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsProtocol_FlexibleTwoWayFieldsErr_DynamicFlags = ::fidl::MessageDynamicFlags::kFlexibleMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsProtocol_FlexibleTwoWayUnionErr_Ordinal = 2410151523245950935lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsProtocol_FlexibleTwoWayUnionErr_DynamicFlags = ::fidl::MessageDynamicFlags::kFlexibleMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsProtocol_FlexibleTwoWayTableErr_Ordinal = 7893309626427980786lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsProtocol_FlexibleTwoWayTableErr_DynamicFlags = ::fidl::MessageDynamicFlags::kFlexibleMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsProtocol_StrictEvent_Ordinal = 685715276307386305lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsProtocol_StrictEvent_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsProtocol_StrictEventFields_Ordinal = 8896208255987935026lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsProtocol_StrictEventFields_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsProtocol_StrictEventUnion_Ordinal = 3919175221694221274lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsProtocol_StrictEventUnion_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsProtocol_StrictEventTable_Ordinal = 2711448698318579984lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsProtocol_StrictEventTable_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsProtocol_FlexibleEvent_Ordinal = 7042257263728687206lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsProtocol_FlexibleEvent_DynamicFlags = ::fidl::MessageDynamicFlags::kFlexibleMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsProtocol_FlexibleEventFields_Ordinal = 3613822014516746241lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsProtocol_FlexibleEventFields_DynamicFlags = ::fidl::MessageDynamicFlags::kFlexibleMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsProtocol_FlexibleEventUnion_Ordinal = 2499446536152409191lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsProtocol_FlexibleEventUnion_DynamicFlags = ::fidl::MessageDynamicFlags::kFlexibleMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsProtocol_FlexibleEventTable_Ordinal = 5724881371349617120lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsProtocol_FlexibleEventTable_DynamicFlags = ::fidl::MessageDynamicFlags::kFlexibleMethod;

#ifdef __Fuchsia__
}  // namespace test_unknowninteractions

::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWay>
fidl::internal::NaturalClientImpl<::test_unknowninteractions::UnknownInteractionsProtocol>::StrictTwoWay() const {
  return ::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWay>(
      &client_base(), {}, &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWay_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWay_DynamicFlags,
      [](NaturalMessageEncoder& encoder) mutable {
        return ZX_OK;
      },
      [] (
          ::fidl::internal::ThenableBase* base,
          ::fidl::internal::NaturalMessageEncoder& encoder,
          ::fidl::internal::ResponseContext* response_context
      ) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}



::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayFields>
fidl::internal::NaturalClientImpl<::test_unknowninteractions::UnknownInteractionsProtocol>::StrictTwoWayFields() const {
  return ::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayFields>(
      &client_base(), {}, &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayFields_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayFields_DynamicFlags,
      [](NaturalMessageEncoder& encoder) mutable {
        return ZX_OK;
      },
      [] (
          ::fidl::internal::ThenableBase* base,
          ::fidl::internal::NaturalMessageEncoder& encoder,
          ::fidl::internal::ResponseContext* response_context
      ) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}



::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayUnion>
fidl::internal::NaturalClientImpl<::test_unknowninteractions::UnknownInteractionsProtocol>::StrictTwoWayUnion() const {
  return ::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayUnion>(
      &client_base(), {}, &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayUnion_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayUnion_DynamicFlags,
      [](NaturalMessageEncoder& encoder) mutable {
        return ZX_OK;
      },
      [] (
          ::fidl::internal::ThenableBase* base,
          ::fidl::internal::NaturalMessageEncoder& encoder,
          ::fidl::internal::ResponseContext* response_context
      ) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}



::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayTable>
fidl::internal::NaturalClientImpl<::test_unknowninteractions::UnknownInteractionsProtocol>::StrictTwoWayTable() const {
  return ::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayTable>(
      &client_base(), {}, &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayTable_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayTable_DynamicFlags,
      [](NaturalMessageEncoder& encoder) mutable {
        return ZX_OK;
      },
      [] (
          ::fidl::internal::ThenableBase* base,
          ::fidl::internal::NaturalMessageEncoder& encoder,
          ::fidl::internal::ResponseContext* response_context
      ) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}



::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayErr>
fidl::internal::NaturalClientImpl<::test_unknowninteractions::UnknownInteractionsProtocol>::StrictTwoWayErr() const {
  return ::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayErr>(
      &client_base(), {}, &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayErr_DynamicFlags,
      [](NaturalMessageEncoder& encoder) mutable {
        return ZX_OK;
      },
      [] (
          ::fidl::internal::ThenableBase* base,
          ::fidl::internal::NaturalMessageEncoder& encoder,
          ::fidl::internal::ResponseContext* response_context
      ) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}



::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayFieldsErr>
fidl::internal::NaturalClientImpl<::test_unknowninteractions::UnknownInteractionsProtocol>::StrictTwoWayFieldsErr() const {
  return ::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayFieldsErr>(
      &client_base(), {}, &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayFieldsErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayFieldsErr_DynamicFlags,
      [](NaturalMessageEncoder& encoder) mutable {
        return ZX_OK;
      },
      [] (
          ::fidl::internal::ThenableBase* base,
          ::fidl::internal::NaturalMessageEncoder& encoder,
          ::fidl::internal::ResponseContext* response_context
      ) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}



::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayUnionErr>
fidl::internal::NaturalClientImpl<::test_unknowninteractions::UnknownInteractionsProtocol>::StrictTwoWayUnionErr() const {
  return ::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayUnionErr>(
      &client_base(), {}, &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayUnionErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayUnionErr_DynamicFlags,
      [](NaturalMessageEncoder& encoder) mutable {
        return ZX_OK;
      },
      [] (
          ::fidl::internal::ThenableBase* base,
          ::fidl::internal::NaturalMessageEncoder& encoder,
          ::fidl::internal::ResponseContext* response_context
      ) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}



::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayTableErr>
fidl::internal::NaturalClientImpl<::test_unknowninteractions::UnknownInteractionsProtocol>::StrictTwoWayTableErr() const {
  return ::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayTableErr>(
      &client_base(), {}, &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayTableErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayTableErr_DynamicFlags,
      [](NaturalMessageEncoder& encoder) mutable {
        return ZX_OK;
      },
      [] (
          ::fidl::internal::ThenableBase* base,
          ::fidl::internal::NaturalMessageEncoder& encoder,
          ::fidl::internal::ResponseContext* response_context
      ) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}



::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWay>
fidl::internal::NaturalClientImpl<::test_unknowninteractions::UnknownInteractionsProtocol>::FlexibleTwoWay() const {
  return ::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWay>(
      &client_base(), {}, &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWay_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWay_DynamicFlags,
      [](NaturalMessageEncoder& encoder) mutable {
        return ZX_OK;
      },
      [] (
          ::fidl::internal::ThenableBase* base,
          ::fidl::internal::NaturalMessageEncoder& encoder,
          ::fidl::internal::ResponseContext* response_context
      ) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}



::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayFields>
fidl::internal::NaturalClientImpl<::test_unknowninteractions::UnknownInteractionsProtocol>::FlexibleTwoWayFields() const {
  return ::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayFields>(
      &client_base(), {}, &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayFields_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayFields_DynamicFlags,
      [](NaturalMessageEncoder& encoder) mutable {
        return ZX_OK;
      },
      [] (
          ::fidl::internal::ThenableBase* base,
          ::fidl::internal::NaturalMessageEncoder& encoder,
          ::fidl::internal::ResponseContext* response_context
      ) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}



::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayUnion>
fidl::internal::NaturalClientImpl<::test_unknowninteractions::UnknownInteractionsProtocol>::FlexibleTwoWayUnion() const {
  return ::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayUnion>(
      &client_base(), {}, &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayUnion_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayUnion_DynamicFlags,
      [](NaturalMessageEncoder& encoder) mutable {
        return ZX_OK;
      },
      [] (
          ::fidl::internal::ThenableBase* base,
          ::fidl::internal::NaturalMessageEncoder& encoder,
          ::fidl::internal::ResponseContext* response_context
      ) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}



::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayTable>
fidl::internal::NaturalClientImpl<::test_unknowninteractions::UnknownInteractionsProtocol>::FlexibleTwoWayTable() const {
  return ::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayTable>(
      &client_base(), {}, &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayTable_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayTable_DynamicFlags,
      [](NaturalMessageEncoder& encoder) mutable {
        return ZX_OK;
      },
      [] (
          ::fidl::internal::ThenableBase* base,
          ::fidl::internal::NaturalMessageEncoder& encoder,
          ::fidl::internal::ResponseContext* response_context
      ) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}



::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayErr>
fidl::internal::NaturalClientImpl<::test_unknowninteractions::UnknownInteractionsProtocol>::FlexibleTwoWayErr() const {
  return ::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayErr>(
      &client_base(), {}, &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayErr_DynamicFlags,
      [](NaturalMessageEncoder& encoder) mutable {
        return ZX_OK;
      },
      [] (
          ::fidl::internal::ThenableBase* base,
          ::fidl::internal::NaturalMessageEncoder& encoder,
          ::fidl::internal::ResponseContext* response_context
      ) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}



::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayFieldsErr>
fidl::internal::NaturalClientImpl<::test_unknowninteractions::UnknownInteractionsProtocol>::FlexibleTwoWayFieldsErr() const {
  return ::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayFieldsErr>(
      &client_base(), {}, &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayFieldsErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayFieldsErr_DynamicFlags,
      [](NaturalMessageEncoder& encoder) mutable {
        return ZX_OK;
      },
      [] (
          ::fidl::internal::ThenableBase* base,
          ::fidl::internal::NaturalMessageEncoder& encoder,
          ::fidl::internal::ResponseContext* response_context
      ) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}



::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayUnionErr>
fidl::internal::NaturalClientImpl<::test_unknowninteractions::UnknownInteractionsProtocol>::FlexibleTwoWayUnionErr() const {
  return ::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayUnionErr>(
      &client_base(), {}, &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayUnionErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayUnionErr_DynamicFlags,
      [](NaturalMessageEncoder& encoder) mutable {
        return ZX_OK;
      },
      [] (
          ::fidl::internal::ThenableBase* base,
          ::fidl::internal::NaturalMessageEncoder& encoder,
          ::fidl::internal::ResponseContext* response_context
      ) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}



::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayTableErr>
fidl::internal::NaturalClientImpl<::test_unknowninteractions::UnknownInteractionsProtocol>::FlexibleTwoWayTableErr() const {
  return ::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayTableErr>(
      &client_base(), {}, &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayTableErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayTableErr_DynamicFlags,
      [](NaturalMessageEncoder& encoder) mutable {
        return ZX_OK;
      },
      [] (
          ::fidl::internal::ThenableBase* base,
          ::fidl::internal::NaturalMessageEncoder& encoder,
          ::fidl::internal::ResponseContext* response_context
      ) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}



::fit::result<::fidl::OneWayError>
fidl::internal::NaturalClientImpl<::test_unknowninteractions::UnknownInteractionsProtocol>::StrictOneWay() const {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictOneWay_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictOneWay_DynamicFlags };
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  ::fidl::OneWayStatus status = client_base().SendOneWay(_encoded_message);
  return ::fidl::internal::ToFitxResult(status);
}


::fit::result<::fidl::OneWayError>
fidl::internal::NaturalClientImpl<::test_unknowninteractions::UnknownInteractionsProtocol>::FlexibleOneWay() const {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleOneWay_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleOneWay_DynamicFlags };
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  ::fidl::OneWayStatus status = client_base().SendOneWay(_encoded_message);
  return ::fidl::internal::ToFitxResult(status);
}
namespace test_unknowninteractions {

#endif  // __Fuchsia__

}  // namespace test_unknowninteractions

#ifdef __Fuchsia__



  ::fidl::Result<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWay>
  fidl::internal::NaturalSyncClientImpl<::test_unknowninteractions::UnknownInteractionsProtocol>::StrictTwoWay() {
    ::fidl::internal::NaturalMessageEncoder encoder{
        &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWay_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWay_DynamicFlags };
    ::fidl::OutgoingMessage msg = encoder.GetMessage();
    ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWay>> response_storage;
    return ::fidl::internal::DecodeResponseAndFoldError<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWay>(
        msg.Call(_client_end().handle(), response_storage.view()), nullptr);
  }


  ::fidl::Result<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayFields>
  fidl::internal::NaturalSyncClientImpl<::test_unknowninteractions::UnknownInteractionsProtocol>::StrictTwoWayFields() {
    ::fidl::internal::NaturalMessageEncoder encoder{
        &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayFields_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayFields_DynamicFlags };
    ::fidl::OutgoingMessage msg = encoder.GetMessage();
    ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayFields>> response_storage;
    return ::fidl::internal::DecodeResponseAndFoldError<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayFields>(
        msg.Call(_client_end().handle(), response_storage.view()), nullptr);
  }


  ::fidl::Result<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayUnion>
  fidl::internal::NaturalSyncClientImpl<::test_unknowninteractions::UnknownInteractionsProtocol>::StrictTwoWayUnion() {
    ::fidl::internal::NaturalMessageEncoder encoder{
        &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayUnion_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayUnion_DynamicFlags };
    ::fidl::OutgoingMessage msg = encoder.GetMessage();
    ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayUnion>> response_storage;
    return ::fidl::internal::DecodeResponseAndFoldError<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayUnion>(
        msg.Call(_client_end().handle(), response_storage.view()), nullptr);
  }


  ::fidl::Result<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayTable>
  fidl::internal::NaturalSyncClientImpl<::test_unknowninteractions::UnknownInteractionsProtocol>::StrictTwoWayTable() {
    ::fidl::internal::NaturalMessageEncoder encoder{
        &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayTable_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayTable_DynamicFlags };
    ::fidl::OutgoingMessage msg = encoder.GetMessage();
    ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayTable>> response_storage;
    return ::fidl::internal::DecodeResponseAndFoldError<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayTable>(
        msg.Call(_client_end().handle(), response_storage.view()), nullptr);
  }


  ::fidl::Result<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayErr>
  fidl::internal::NaturalSyncClientImpl<::test_unknowninteractions::UnknownInteractionsProtocol>::StrictTwoWayErr() {
    ::fidl::internal::NaturalMessageEncoder encoder{
        &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayErr_DynamicFlags };
    ::fidl::OutgoingMessage msg = encoder.GetMessage();
    ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayErr>> response_storage;
    return ::fidl::internal::DecodeResponseAndFoldError<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayErr>(
        msg.Call(_client_end().handle(), response_storage.view()), nullptr);
  }


  ::fidl::Result<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayFieldsErr>
  fidl::internal::NaturalSyncClientImpl<::test_unknowninteractions::UnknownInteractionsProtocol>::StrictTwoWayFieldsErr() {
    ::fidl::internal::NaturalMessageEncoder encoder{
        &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayFieldsErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayFieldsErr_DynamicFlags };
    ::fidl::OutgoingMessage msg = encoder.GetMessage();
    ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayFieldsErr>> response_storage;
    return ::fidl::internal::DecodeResponseAndFoldError<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayFieldsErr>(
        msg.Call(_client_end().handle(), response_storage.view()), nullptr);
  }


  ::fidl::Result<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayUnionErr>
  fidl::internal::NaturalSyncClientImpl<::test_unknowninteractions::UnknownInteractionsProtocol>::StrictTwoWayUnionErr() {
    ::fidl::internal::NaturalMessageEncoder encoder{
        &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayUnionErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayUnionErr_DynamicFlags };
    ::fidl::OutgoingMessage msg = encoder.GetMessage();
    ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayUnionErr>> response_storage;
    return ::fidl::internal::DecodeResponseAndFoldError<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayUnionErr>(
        msg.Call(_client_end().handle(), response_storage.view()), nullptr);
  }


  ::fidl::Result<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayTableErr>
  fidl::internal::NaturalSyncClientImpl<::test_unknowninteractions::UnknownInteractionsProtocol>::StrictTwoWayTableErr() {
    ::fidl::internal::NaturalMessageEncoder encoder{
        &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayTableErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayTableErr_DynamicFlags };
    ::fidl::OutgoingMessage msg = encoder.GetMessage();
    ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayTableErr>> response_storage;
    return ::fidl::internal::DecodeResponseAndFoldError<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayTableErr>(
        msg.Call(_client_end().handle(), response_storage.view()), nullptr);
  }


  ::fidl::Result<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWay>
  fidl::internal::NaturalSyncClientImpl<::test_unknowninteractions::UnknownInteractionsProtocol>::FlexibleTwoWay() {
    ::fidl::internal::NaturalMessageEncoder encoder{
        &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWay_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWay_DynamicFlags };
    ::fidl::OutgoingMessage msg = encoder.GetMessage();
    ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWay>> response_storage;
    return ::fidl::internal::DecodeResponseAndFoldError<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWay>(
        msg.Call(_client_end().handle(), response_storage.view()), nullptr);
  }


  ::fidl::Result<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayFields>
  fidl::internal::NaturalSyncClientImpl<::test_unknowninteractions::UnknownInteractionsProtocol>::FlexibleTwoWayFields() {
    ::fidl::internal::NaturalMessageEncoder encoder{
        &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayFields_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayFields_DynamicFlags };
    ::fidl::OutgoingMessage msg = encoder.GetMessage();
    ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayFields>> response_storage;
    return ::fidl::internal::DecodeResponseAndFoldError<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayFields>(
        msg.Call(_client_end().handle(), response_storage.view()), nullptr);
  }


  ::fidl::Result<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayUnion>
  fidl::internal::NaturalSyncClientImpl<::test_unknowninteractions::UnknownInteractionsProtocol>::FlexibleTwoWayUnion() {
    ::fidl::internal::NaturalMessageEncoder encoder{
        &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayUnion_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayUnion_DynamicFlags };
    ::fidl::OutgoingMessage msg = encoder.GetMessage();
    ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayUnion>> response_storage;
    return ::fidl::internal::DecodeResponseAndFoldError<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayUnion>(
        msg.Call(_client_end().handle(), response_storage.view()), nullptr);
  }


  ::fidl::Result<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayTable>
  fidl::internal::NaturalSyncClientImpl<::test_unknowninteractions::UnknownInteractionsProtocol>::FlexibleTwoWayTable() {
    ::fidl::internal::NaturalMessageEncoder encoder{
        &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayTable_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayTable_DynamicFlags };
    ::fidl::OutgoingMessage msg = encoder.GetMessage();
    ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayTable>> response_storage;
    return ::fidl::internal::DecodeResponseAndFoldError<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayTable>(
        msg.Call(_client_end().handle(), response_storage.view()), nullptr);
  }


  ::fidl::Result<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayErr>
  fidl::internal::NaturalSyncClientImpl<::test_unknowninteractions::UnknownInteractionsProtocol>::FlexibleTwoWayErr() {
    ::fidl::internal::NaturalMessageEncoder encoder{
        &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayErr_DynamicFlags };
    ::fidl::OutgoingMessage msg = encoder.GetMessage();
    ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayErr>> response_storage;
    return ::fidl::internal::DecodeResponseAndFoldError<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayErr>(
        msg.Call(_client_end().handle(), response_storage.view()), nullptr);
  }


  ::fidl::Result<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayFieldsErr>
  fidl::internal::NaturalSyncClientImpl<::test_unknowninteractions::UnknownInteractionsProtocol>::FlexibleTwoWayFieldsErr() {
    ::fidl::internal::NaturalMessageEncoder encoder{
        &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayFieldsErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayFieldsErr_DynamicFlags };
    ::fidl::OutgoingMessage msg = encoder.GetMessage();
    ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayFieldsErr>> response_storage;
    return ::fidl::internal::DecodeResponseAndFoldError<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayFieldsErr>(
        msg.Call(_client_end().handle(), response_storage.view()), nullptr);
  }


  ::fidl::Result<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayUnionErr>
  fidl::internal::NaturalSyncClientImpl<::test_unknowninteractions::UnknownInteractionsProtocol>::FlexibleTwoWayUnionErr() {
    ::fidl::internal::NaturalMessageEncoder encoder{
        &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayUnionErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayUnionErr_DynamicFlags };
    ::fidl::OutgoingMessage msg = encoder.GetMessage();
    ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayUnionErr>> response_storage;
    return ::fidl::internal::DecodeResponseAndFoldError<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayUnionErr>(
        msg.Call(_client_end().handle(), response_storage.view()), nullptr);
  }


  ::fidl::Result<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayTableErr>
  fidl::internal::NaturalSyncClientImpl<::test_unknowninteractions::UnknownInteractionsProtocol>::FlexibleTwoWayTableErr() {
    ::fidl::internal::NaturalMessageEncoder encoder{
        &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayTableErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayTableErr_DynamicFlags };
    ::fidl::OutgoingMessage msg = encoder.GetMessage();
    ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayTableErr>> response_storage;
    return ::fidl::internal::DecodeResponseAndFoldError<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayTableErr>(
        msg.Call(_client_end().handle(), response_storage.view()), nullptr);
  }




  ::fit::result<::fidl::OneWayError>
  fidl::internal::NaturalSyncClientImpl<::test_unknowninteractions::UnknownInteractionsProtocol>::StrictOneWay() {
    ::fidl::internal::NaturalMessageEncoder encoder{
        &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictOneWay_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictOneWay_DynamicFlags };
    ::fidl::OutgoingMessage msg = encoder.GetMessage();
    msg.Write(_client_end().handle());
    return ::fidl::internal::ToFitxResult(::fidl::OneWayStatus{msg});
  }


  ::fit::result<::fidl::OneWayError>
  fidl::internal::NaturalSyncClientImpl<::test_unknowninteractions::UnknownInteractionsProtocol>::FlexibleOneWay() {
    ::fidl::internal::NaturalMessageEncoder encoder{
        &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleOneWay_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleOneWay_DynamicFlags };
    ::fidl::OutgoingMessage msg = encoder.GetMessage();
    msg.Write(_client_end().handle());
    return ::fidl::internal::ToFitxResult(::fidl::OneWayStatus{msg});
  }



#endif  // __Fuchsia__



#ifdef __Fuchsia__



  ::fidl::Status fidl::SyncEventHandler<::test_unknowninteractions::UnknownInteractionsProtocol>::HandleOneEvent(
      ::fidl::UnownedClientEnd<::test_unknowninteractions::UnknownInteractionsProtocol> client_end) {
      ::fidl::internal::IncomingEventsStorage<::test_unknowninteractions::UnknownInteractionsProtocol> event_storage;
      fidl::internal::NaturalEventDispatcher<::test_unknowninteractions::UnknownInteractionsProtocol> dispatcher{this};
      return HandleOneEventImpl_(client_end.channel(), event_storage.view(), dispatcher);
  }
  ::fidl::Status
  fidl::internal::NaturalEventDispatcher<::test_unknowninteractions::UnknownInteractionsProtocol>::DispatchEvent(
      ::fidl::IncomingHeaderAndMessage& msg,
      ::fidl::internal::MessageStorageViewBase* storage_view) {
    switch (msg.header()->ordinal) {
      case ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictEvent_Ordinal:
      {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessage(std::move(msg));
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        if (event_handler()) {;
          event_handler()->StrictEvent();
        }
        return ::fidl::Status::Ok();
      }
      case ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictEventFields_Ordinal:
      {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessage<::test_unknowninteractions::UnknownInteractionsProtocolStrictEventFieldsRequest>(std::move(msg));
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        if (event_handler()) {
            ::fidl::Event<::test_unknowninteractions::UnknownInteractionsProtocol::StrictEventFields> event = std::move(decoded.value());
          event_handler()->StrictEventFields(event);
        }
        return ::fidl::Status::Ok();
      }
      case ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictEventUnion_Ordinal:
      {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessage<::test_unknowninteractions::UnknownInteractionsProtocolStrictEventUnionRequest>(std::move(msg));
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        if (event_handler()) {
            ::fidl::Event<::test_unknowninteractions::UnknownInteractionsProtocol::StrictEventUnion> event = std::move(decoded.value());
          event_handler()->StrictEventUnion(event);
        }
        return ::fidl::Status::Ok();
      }
      case ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictEventTable_Ordinal:
      {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessage<::test_unknowninteractions::UnknownInteractionsProtocolStrictEventTableRequest>(std::move(msg));
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        if (event_handler()) {
            ::fidl::Event<::test_unknowninteractions::UnknownInteractionsProtocol::StrictEventTable> event = std::move(decoded.value());
          event_handler()->StrictEventTable(event);
        }
        return ::fidl::Status::Ok();
      }
      case ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleEvent_Ordinal:
      {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessage(std::move(msg));
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        if (event_handler()) {;
          event_handler()->FlexibleEvent();
        }
        return ::fidl::Status::Ok();
      }
      case ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleEventFields_Ordinal:
      {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessage<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventFieldsRequest>(std::move(msg));
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        if (event_handler()) {
            ::fidl::Event<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleEventFields> event = std::move(decoded.value());
          event_handler()->FlexibleEventFields(event);
        }
        return ::fidl::Status::Ok();
      }
      case ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleEventUnion_Ordinal:
      {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessage<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventUnionRequest>(std::move(msg));
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        if (event_handler()) {
            ::fidl::Event<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleEventUnion> event = std::move(decoded.value());
          event_handler()->FlexibleEventUnion(event);
        }
        return ::fidl::Status::Ok();
      }
      case ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleEventTable_Ordinal:
      {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessage<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventTableRequest>(std::move(msg));
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        if (event_handler()) {
            ::fidl::Event<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleEventTable> event = std::move(decoded.value());
          event_handler()->FlexibleEventTable(event);
        }
        return ::fidl::Status::Ok();
      }
      default:
        auto* hdr = msg.header();
        ::fidl::UnknownMethodType unknown_method_type =
            ::fidl::internal::UnknownMethodTypeFromHeader(hdr);
        bool is_flexible_interaction = ::fidl::IsFlexibleInteraction(hdr);
        auto ordinal = hdr->ordinal;
        std::move(msg).CloseHandles();
        if (is_flexible_interaction &&
            ::fidl::internal::CanHandleEvent(::test_unknowninteractions::UnknownInteractionsProtocol::kOpenness, unknown_method_type)) {
          if (event_handler()) {
            ::fidl::UnknownEventMetadata<::test_unknowninteractions::UnknownInteractionsProtocol> metadata {
              .event_ordinal = ordinal,
            };
            event_handler()->handle_unknown_event(metadata);
          }
          return ::fidl::Status::Ok();
        }
        return ::fidl::Status::UnknownOrdinal();
    }
  }

#endif  // __Fuchsia__




#ifdef __Fuchsia__


::fit::result<::fidl::OneWayError> fidl::internal::NaturalWeakEventSender<::test_unknowninteractions::UnknownInteractionsProtocol>::StrictEvent() {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictEvent_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictEvent_DynamicFlags };
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  return ::fidl::internal::ToFitxResult(_inner().SendEvent(_encoded_message));
}

::fit::result<::fidl::OneWayError> fidl::internal::NaturalEventSender<::test_unknowninteractions::UnknownInteractionsProtocol>::StrictEvent() {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictEvent_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictEvent_DynamicFlags };
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  _encoded_message.Write(_transport());
  return ::fidl::internal::ToFitxResult(::fidl::OneWayStatus{::fidl::Status{_encoded_message}});
}

  

::fit::result<::fidl::OneWayError> fidl::internal::NaturalWeakEventSender<::test_unknowninteractions::UnknownInteractionsProtocol>::StrictEventFields(const ::test_unknowninteractions::UnknownInteractionsProtocolStrictEventFieldsRequest& payload) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictEventFields_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictEventFields_DynamicFlags };
  _encoder.EncodeBody(payload);
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  return ::fidl::internal::ToFitxResult(_inner().SendEvent(_encoded_message));
}

::fit::result<::fidl::OneWayError> fidl::internal::NaturalEventSender<::test_unknowninteractions::UnknownInteractionsProtocol>::StrictEventFields(const ::test_unknowninteractions::UnknownInteractionsProtocolStrictEventFieldsRequest& payload) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictEventFields_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictEventFields_DynamicFlags };
  _encoder.EncodeBody(payload);
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  _encoded_message.Write(_transport());
  return ::fidl::internal::ToFitxResult(::fidl::OneWayStatus{::fidl::Status{_encoded_message}});
}

  

::fit::result<::fidl::OneWayError> fidl::internal::NaturalWeakEventSender<::test_unknowninteractions::UnknownInteractionsProtocol>::StrictEventUnion(const ::test_unknowninteractions::UnknownInteractionsProtocolStrictEventUnionRequest& payload) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictEventUnion_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictEventUnion_DynamicFlags };
  _encoder.EncodeBody(payload);
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  return ::fidl::internal::ToFitxResult(_inner().SendEvent(_encoded_message));
}

::fit::result<::fidl::OneWayError> fidl::internal::NaturalEventSender<::test_unknowninteractions::UnknownInteractionsProtocol>::StrictEventUnion(const ::test_unknowninteractions::UnknownInteractionsProtocolStrictEventUnionRequest& payload) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictEventUnion_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictEventUnion_DynamicFlags };
  _encoder.EncodeBody(payload);
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  _encoded_message.Write(_transport());
  return ::fidl::internal::ToFitxResult(::fidl::OneWayStatus{::fidl::Status{_encoded_message}});
}

  

::fit::result<::fidl::OneWayError> fidl::internal::NaturalWeakEventSender<::test_unknowninteractions::UnknownInteractionsProtocol>::StrictEventTable(const ::test_unknowninteractions::UnknownInteractionsProtocolStrictEventTableRequest& payload) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictEventTable_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictEventTable_DynamicFlags };
  _encoder.EncodeBody(payload);
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  return ::fidl::internal::ToFitxResult(_inner().SendEvent(_encoded_message));
}

::fit::result<::fidl::OneWayError> fidl::internal::NaturalEventSender<::test_unknowninteractions::UnknownInteractionsProtocol>::StrictEventTable(const ::test_unknowninteractions::UnknownInteractionsProtocolStrictEventTableRequest& payload) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictEventTable_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictEventTable_DynamicFlags };
  _encoder.EncodeBody(payload);
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  _encoded_message.Write(_transport());
  return ::fidl::internal::ToFitxResult(::fidl::OneWayStatus{::fidl::Status{_encoded_message}});
}

  

::fit::result<::fidl::OneWayError> fidl::internal::NaturalWeakEventSender<::test_unknowninteractions::UnknownInteractionsProtocol>::FlexibleEvent() {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleEvent_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleEvent_DynamicFlags };
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  return ::fidl::internal::ToFitxResult(_inner().SendEvent(_encoded_message));
}

::fit::result<::fidl::OneWayError> fidl::internal::NaturalEventSender<::test_unknowninteractions::UnknownInteractionsProtocol>::FlexibleEvent() {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleEvent_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleEvent_DynamicFlags };
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  _encoded_message.Write(_transport());
  return ::fidl::internal::ToFitxResult(::fidl::OneWayStatus{::fidl::Status{_encoded_message}});
}

  

::fit::result<::fidl::OneWayError> fidl::internal::NaturalWeakEventSender<::test_unknowninteractions::UnknownInteractionsProtocol>::FlexibleEventFields(const ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventFieldsRequest& payload) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleEventFields_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleEventFields_DynamicFlags };
  _encoder.EncodeBody(payload);
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  return ::fidl::internal::ToFitxResult(_inner().SendEvent(_encoded_message));
}

::fit::result<::fidl::OneWayError> fidl::internal::NaturalEventSender<::test_unknowninteractions::UnknownInteractionsProtocol>::FlexibleEventFields(const ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventFieldsRequest& payload) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleEventFields_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleEventFields_DynamicFlags };
  _encoder.EncodeBody(payload);
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  _encoded_message.Write(_transport());
  return ::fidl::internal::ToFitxResult(::fidl::OneWayStatus{::fidl::Status{_encoded_message}});
}

  

::fit::result<::fidl::OneWayError> fidl::internal::NaturalWeakEventSender<::test_unknowninteractions::UnknownInteractionsProtocol>::FlexibleEventUnion(const ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventUnionRequest& payload) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleEventUnion_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleEventUnion_DynamicFlags };
  _encoder.EncodeBody(payload);
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  return ::fidl::internal::ToFitxResult(_inner().SendEvent(_encoded_message));
}

::fit::result<::fidl::OneWayError> fidl::internal::NaturalEventSender<::test_unknowninteractions::UnknownInteractionsProtocol>::FlexibleEventUnion(const ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventUnionRequest& payload) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleEventUnion_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleEventUnion_DynamicFlags };
  _encoder.EncodeBody(payload);
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  _encoded_message.Write(_transport());
  return ::fidl::internal::ToFitxResult(::fidl::OneWayStatus{::fidl::Status{_encoded_message}});
}

  

::fit::result<::fidl::OneWayError> fidl::internal::NaturalWeakEventSender<::test_unknowninteractions::UnknownInteractionsProtocol>::FlexibleEventTable(const ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventTableRequest& payload) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleEventTable_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleEventTable_DynamicFlags };
  _encoder.EncodeBody(payload);
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  return ::fidl::internal::ToFitxResult(_inner().SendEvent(_encoded_message));
}

::fit::result<::fidl::OneWayError> fidl::internal::NaturalEventSender<::test_unknowninteractions::UnknownInteractionsProtocol>::FlexibleEventTable(const ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventTableRequest& payload) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleEventTable_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleEventTable_DynamicFlags };
  _encoder.EncodeBody(payload);
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  _encoded_message.Write(_transport());
  return ::fidl::internal::ToFitxResult(::fidl::OneWayStatus{::fidl::Status{_encoded_message}});
}

  

#endif  // __Fuchsia__




void fidl::internal::NaturalCompleterBase<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWay>::Reply() {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWay_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWay_DynamicFlags };
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}


void fidl::internal::NaturalCompleterBase<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayFields>::Reply(const ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayFields>& response) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayFields_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayFields_DynamicFlags };
  _encoder.EncodeBody(
      ::fidl::internal::ResponseMessageConverter<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayFields>::IntoDomainObject(response));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}


void fidl::internal::NaturalCompleterBase<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayUnion>::Reply(const ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayUnion>& response) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayUnion_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayUnion_DynamicFlags };
  _encoder.EncodeBody(
      ::fidl::internal::ResponseMessageConverter<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayUnion>::IntoDomainObject(response));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}


void fidl::internal::NaturalCompleterBase<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayTable>::Reply(const ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayTable>& response) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayTable_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayTable_DynamicFlags };
  _encoder.EncodeBody(
      ::fidl::internal::ResponseMessageConverter<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayTable>::IntoDomainObject(response));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}


void fidl::internal::NaturalCompleterBase<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayErr>::Reply(const ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayErr>& response) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayErr_DynamicFlags };
  _encoder.EncodeBody(
      ::fidl::internal::ResponseMessageConverter<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayErr>::IntoDomainObject(response));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}


void fidl::internal::NaturalCompleterBase<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayFieldsErr>::Reply(const ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayFieldsErr>& response) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayFieldsErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayFieldsErr_DynamicFlags };
  _encoder.EncodeBody(
      ::fidl::internal::ResponseMessageConverter<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayFieldsErr>::IntoDomainObject(response));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}


void fidl::internal::NaturalCompleterBase<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayUnionErr>::Reply(const ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayUnionErr>& response) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayUnionErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayUnionErr_DynamicFlags };
  _encoder.EncodeBody(
      ::fidl::internal::ResponseMessageConverter<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayUnionErr>::IntoDomainObject(response));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}


void fidl::internal::NaturalCompleterBase<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayTableErr>::Reply(const ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayTableErr>& response) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayTableErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayTableErr_DynamicFlags };
  _encoder.EncodeBody(
      ::fidl::internal::ResponseMessageConverter<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayTableErr>::IntoDomainObject(response));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}


void fidl::internal::NaturalCompleterBase<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWay>::Reply() {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWay_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWay_DynamicFlags };
  _encoder.EncodeBody(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayResult::WithResponse({}));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}


void fidl::internal::NaturalCompleterBase<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayFields>::Reply(const ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayFields>& response) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayFields_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayFields_DynamicFlags };
  _encoder.EncodeBody(
      ::fidl::internal::ResponseMessageConverter<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayFields>::IntoDomainObject(response));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}


void fidl::internal::NaturalCompleterBase<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayUnion>::Reply(const ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayUnion>& response) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayUnion_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayUnion_DynamicFlags };
  _encoder.EncodeBody(
      ::fidl::internal::ResponseMessageConverter<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayUnion>::IntoDomainObject(response));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}


void fidl::internal::NaturalCompleterBase<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayTable>::Reply(const ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayTable>& response) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayTable_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayTable_DynamicFlags };
  _encoder.EncodeBody(
      ::fidl::internal::ResponseMessageConverter<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayTable>::IntoDomainObject(response));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}


void fidl::internal::NaturalCompleterBase<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayErr>::Reply(const ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayErr>& response) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayErr_DynamicFlags };
  _encoder.EncodeBody(
      ::fidl::internal::ResponseMessageConverter<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayErr>::IntoDomainObject(response));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}


void fidl::internal::NaturalCompleterBase<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayFieldsErr>::Reply(const ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayFieldsErr>& response) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayFieldsErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayFieldsErr_DynamicFlags };
  _encoder.EncodeBody(
      ::fidl::internal::ResponseMessageConverter<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayFieldsErr>::IntoDomainObject(response));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}


void fidl::internal::NaturalCompleterBase<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayUnionErr>::Reply(const ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayUnionErr>& response) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayUnionErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayUnionErr_DynamicFlags };
  _encoder.EncodeBody(
      ::fidl::internal::ResponseMessageConverter<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayUnionErr>::IntoDomainObject(response));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}


void fidl::internal::NaturalCompleterBase<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayTableErr>::Reply(const ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayTableErr>& response) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayTableErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayTableErr_DynamicFlags };
  _encoder.EncodeBody(
      ::fidl::internal::ResponseMessageConverter<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayTableErr>::IntoDomainObject(response));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}

#ifdef __Fuchsia__



constexpr ::fidl::internal::MethodEntry fidl::internal::NaturalServerDispatcher<::test_unknowninteractions::UnknownInteractionsProtocol>::entries_[] = {
    { ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictOneWay_Ordinal,
      [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
         internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody(
            msg, metadata);
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        ::fidl::internal::NaturalCompleter<::test_unknowninteractions::UnknownInteractionsProtocol::StrictOneWay>::Sync completer(txn);
        static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsProtocol>*>(interface)->StrictOneWay(
            
            completer);
        return ::fidl::Status::Ok();
      },
    },
    { ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleOneWay_Ordinal,
      [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
         internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody(
            msg, metadata);
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        ::fidl::internal::NaturalCompleter<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleOneWay>::Sync completer(txn);
        static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsProtocol>*>(interface)->FlexibleOneWay(
            
            completer);
        return ::fidl::Status::Ok();
      },
    },
    { ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWay_Ordinal,
      [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
         internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody(
            msg, metadata);
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        ::fidl::internal::NaturalCompleter<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWay>::Sync completer(txn);
        static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsProtocol>*>(interface)->StrictTwoWay(
            
            completer);
        return ::fidl::Status::Ok();
      },
    },
    { ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayFields_Ordinal,
      [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
         internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody(
            msg, metadata);
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        ::fidl::internal::NaturalCompleter<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayFields>::Sync completer(txn);
        static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsProtocol>*>(interface)->StrictTwoWayFields(
            
            completer);
        return ::fidl::Status::Ok();
      },
    },
    { ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayUnion_Ordinal,
      [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
         internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody(
            msg, metadata);
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        ::fidl::internal::NaturalCompleter<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayUnion>::Sync completer(txn);
        static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsProtocol>*>(interface)->StrictTwoWayUnion(
            
            completer);
        return ::fidl::Status::Ok();
      },
    },
    { ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayTable_Ordinal,
      [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
         internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody(
            msg, metadata);
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        ::fidl::internal::NaturalCompleter<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayTable>::Sync completer(txn);
        static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsProtocol>*>(interface)->StrictTwoWayTable(
            
            completer);
        return ::fidl::Status::Ok();
      },
    },
    { ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayErr_Ordinal,
      [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
         internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody(
            msg, metadata);
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        ::fidl::internal::NaturalCompleter<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayErr>::Sync completer(txn);
        static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsProtocol>*>(interface)->StrictTwoWayErr(
            
            completer);
        return ::fidl::Status::Ok();
      },
    },
    { ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayFieldsErr_Ordinal,
      [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
         internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody(
            msg, metadata);
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        ::fidl::internal::NaturalCompleter<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayFieldsErr>::Sync completer(txn);
        static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsProtocol>*>(interface)->StrictTwoWayFieldsErr(
            
            completer);
        return ::fidl::Status::Ok();
      },
    },
    { ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayUnionErr_Ordinal,
      [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
         internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody(
            msg, metadata);
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        ::fidl::internal::NaturalCompleter<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayUnionErr>::Sync completer(txn);
        static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsProtocol>*>(interface)->StrictTwoWayUnionErr(
            
            completer);
        return ::fidl::Status::Ok();
      },
    },
    { ::test_unknowninteractions::kUnknownInteractionsProtocol_StrictTwoWayTableErr_Ordinal,
      [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
         internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody(
            msg, metadata);
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        ::fidl::internal::NaturalCompleter<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayTableErr>::Sync completer(txn);
        static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsProtocol>*>(interface)->StrictTwoWayTableErr(
            
            completer);
        return ::fidl::Status::Ok();
      },
    },
    { ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWay_Ordinal,
      [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
         internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody(
            msg, metadata);
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        ::fidl::internal::NaturalCompleter<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWay>::Sync completer(txn);
        static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsProtocol>*>(interface)->FlexibleTwoWay(
            
            completer);
        return ::fidl::Status::Ok();
      },
    },
    { ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayFields_Ordinal,
      [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
         internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody(
            msg, metadata);
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        ::fidl::internal::NaturalCompleter<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayFields>::Sync completer(txn);
        static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsProtocol>*>(interface)->FlexibleTwoWayFields(
            
            completer);
        return ::fidl::Status::Ok();
      },
    },
    { ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayUnion_Ordinal,
      [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
         internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody(
            msg, metadata);
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        ::fidl::internal::NaturalCompleter<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayUnion>::Sync completer(txn);
        static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsProtocol>*>(interface)->FlexibleTwoWayUnion(
            
            completer);
        return ::fidl::Status::Ok();
      },
    },
    { ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayTable_Ordinal,
      [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
         internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody(
            msg, metadata);
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        ::fidl::internal::NaturalCompleter<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayTable>::Sync completer(txn);
        static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsProtocol>*>(interface)->FlexibleTwoWayTable(
            
            completer);
        return ::fidl::Status::Ok();
      },
    },
    { ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayErr_Ordinal,
      [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
         internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody(
            msg, metadata);
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        ::fidl::internal::NaturalCompleter<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayErr>::Sync completer(txn);
        static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsProtocol>*>(interface)->FlexibleTwoWayErr(
            
            completer);
        return ::fidl::Status::Ok();
      },
    },
    { ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayFieldsErr_Ordinal,
      [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
         internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody(
            msg, metadata);
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        ::fidl::internal::NaturalCompleter<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayFieldsErr>::Sync completer(txn);
        static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsProtocol>*>(interface)->FlexibleTwoWayFieldsErr(
            
            completer);
        return ::fidl::Status::Ok();
      },
    },
    { ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayUnionErr_Ordinal,
      [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
         internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody(
            msg, metadata);
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        ::fidl::internal::NaturalCompleter<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayUnionErr>::Sync completer(txn);
        static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsProtocol>*>(interface)->FlexibleTwoWayUnionErr(
            
            completer);
        return ::fidl::Status::Ok();
      },
    },
    { ::test_unknowninteractions::kUnknownInteractionsProtocol_FlexibleTwoWayTableErr_Ordinal,
      [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
         internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody(
            msg, metadata);
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        ::fidl::internal::NaturalCompleter<::test_unknowninteractions::UnknownInteractionsProtocol::FlexibleTwoWayTableErr>::Sync completer(txn);
        static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsProtocol>*>(interface)->FlexibleTwoWayTableErr(
            
            completer);
        return ::fidl::Status::Ok();
      },
    },
};

const ::fidl::internal::MethodEntry* fidl::internal::NaturalServerDispatcher<::test_unknowninteractions::UnknownInteractionsProtocol>::entries_end_ =
    &entries_[18];
const ::fidl::internal::UnknownMethodHandlerEntry fidl::internal::NaturalServerDispatcher<::test_unknowninteractions::UnknownInteractionsProtocol>::unknown_method_handler_entry_ = {
  .openness = ::fidl::internal::Openness::kOpen,
  .dispatch = [](void* interface, uint64_t method_ordinal,
      ::fidl::UnknownMethodType unknown_method_type, ::fidl::Transaction* txn) {
    ::fidl::UnknownMethodCompleter::Sync completer(txn);
    static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsProtocol>*>(interface)->handle_unknown_method(
        ::fidl::UnknownMethodMetadata<::test_unknowninteractions::UnknownInteractionsProtocol> {
          .method_ordinal = method_ordinal,
          
          .unknown_method_type = unknown_method_type,
          
      }, completer);
  },
  .send_reply = ::fidl::internal::SendChannelUnknownMethodReply,
};




void fidl::internal::NaturalServerDispatcher<::test_unknowninteractions::UnknownInteractionsProtocol>::Dispatch(::fidl::Server<::test_unknowninteractions::UnknownInteractionsProtocol>* impl, ::fidl::IncomingHeaderAndMessage&& msg,
    internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
  ::fidl::internal::Dispatch(impl, msg, storage_view, txn, entries_, entries_end_, &unknown_method_handler_entry_);
}

void fidl::Server<::test_unknowninteractions::UnknownInteractionsProtocol>::dispatch_message(
    ::fidl::IncomingHeaderAndMessage&& msg, ::fidl::Transaction* txn,
    ::fidl::internal::MessageStorageViewBase* storage_view) {
  ::fidl::internal::NaturalServerDispatcher<::test_unknowninteractions::UnknownInteractionsProtocol>::Dispatch(this, std::move(msg), storage_view, txn);
}

#endif  // __Fuchsia__


namespace test_unknowninteractions {

[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsAjarProtocol_StrictOneWay_Ordinal = 956561744635167883lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsAjarProtocol_StrictOneWay_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsAjarProtocol_FlexibleOneWay_Ordinal = 2483093178939638607lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsAjarProtocol_FlexibleOneWay_DynamicFlags = ::fidl::MessageDynamicFlags::kFlexibleMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsAjarProtocol_StrictTwoWay_Ordinal = 364341676962177080lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsAjarProtocol_StrictTwoWay_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsAjarProtocol_StrictTwoWayFields_Ordinal = 1821674633227946298lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsAjarProtocol_StrictTwoWayFields_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsAjarProtocol_StrictTwoWayUnion_Ordinal = 5870221221557233361lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsAjarProtocol_StrictTwoWayUnion_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsAjarProtocol_StrictTwoWayTable_Ordinal = 8038805778859962068lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsAjarProtocol_StrictTwoWayTable_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsAjarProtocol_StrictTwoWayErr_Ordinal = 6577335136969723910lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsAjarProtocol_StrictTwoWayErr_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsAjarProtocol_StrictTwoWayFieldsErr_Ordinal = 595881957484758745lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsAjarProtocol_StrictTwoWayFieldsErr_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsAjarProtocol_StrictTwoWayUnionErr_Ordinal = 3224530777258896533lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsAjarProtocol_StrictTwoWayUnionErr_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsAjarProtocol_StrictTwoWayTableErr_Ordinal = 3515589146717969463lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsAjarProtocol_StrictTwoWayTableErr_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsAjarProtocol_StrictEvent_Ordinal = 6927291151663612592lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsAjarProtocol_StrictEvent_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsAjarProtocol_StrictEventFields_Ordinal = 5838220329633564521lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsAjarProtocol_StrictEventFields_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsAjarProtocol_StrictEventUnion_Ordinal = 6303151946645602671lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsAjarProtocol_StrictEventUnion_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsAjarProtocol_StrictEventTable_Ordinal = 659277224687564957lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsAjarProtocol_StrictEventTable_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsAjarProtocol_FlexibleEvent_Ordinal = 1281760452005010931lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsAjarProtocol_FlexibleEvent_DynamicFlags = ::fidl::MessageDynamicFlags::kFlexibleMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsAjarProtocol_FlexibleEventFields_Ordinal = 4298964238728681570lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsAjarProtocol_FlexibleEventFields_DynamicFlags = ::fidl::MessageDynamicFlags::kFlexibleMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsAjarProtocol_FlexibleEventUnion_Ordinal = 8950943792372972717lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsAjarProtocol_FlexibleEventUnion_DynamicFlags = ::fidl::MessageDynamicFlags::kFlexibleMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsAjarProtocol_FlexibleEventTable_Ordinal = 705539350563403440lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsAjarProtocol_FlexibleEventTable_DynamicFlags = ::fidl::MessageDynamicFlags::kFlexibleMethod;

#ifdef __Fuchsia__
}  // namespace test_unknowninteractions

::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWay>
fidl::internal::NaturalClientImpl<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::StrictTwoWay() const {
  return ::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWay>(
      &client_base(), {}, &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWay_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWay_DynamicFlags,
      [](NaturalMessageEncoder& encoder) mutable {
        return ZX_OK;
      },
      [] (
          ::fidl::internal::ThenableBase* base,
          ::fidl::internal::NaturalMessageEncoder& encoder,
          ::fidl::internal::ResponseContext* response_context
      ) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}



::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayFields>
fidl::internal::NaturalClientImpl<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::StrictTwoWayFields() const {
  return ::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayFields>(
      &client_base(), {}, &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayFields_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayFields_DynamicFlags,
      [](NaturalMessageEncoder& encoder) mutable {
        return ZX_OK;
      },
      [] (
          ::fidl::internal::ThenableBase* base,
          ::fidl::internal::NaturalMessageEncoder& encoder,
          ::fidl::internal::ResponseContext* response_context
      ) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}



::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayUnion>
fidl::internal::NaturalClientImpl<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::StrictTwoWayUnion() const {
  return ::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayUnion>(
      &client_base(), {}, &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayUnion_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayUnion_DynamicFlags,
      [](NaturalMessageEncoder& encoder) mutable {
        return ZX_OK;
      },
      [] (
          ::fidl::internal::ThenableBase* base,
          ::fidl::internal::NaturalMessageEncoder& encoder,
          ::fidl::internal::ResponseContext* response_context
      ) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}



::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayTable>
fidl::internal::NaturalClientImpl<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::StrictTwoWayTable() const {
  return ::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayTable>(
      &client_base(), {}, &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayTable_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayTable_DynamicFlags,
      [](NaturalMessageEncoder& encoder) mutable {
        return ZX_OK;
      },
      [] (
          ::fidl::internal::ThenableBase* base,
          ::fidl::internal::NaturalMessageEncoder& encoder,
          ::fidl::internal::ResponseContext* response_context
      ) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}



::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayErr>
fidl::internal::NaturalClientImpl<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::StrictTwoWayErr() const {
  return ::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayErr>(
      &client_base(), {}, &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayErr_DynamicFlags,
      [](NaturalMessageEncoder& encoder) mutable {
        return ZX_OK;
      },
      [] (
          ::fidl::internal::ThenableBase* base,
          ::fidl::internal::NaturalMessageEncoder& encoder,
          ::fidl::internal::ResponseContext* response_context
      ) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}



::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayFieldsErr>
fidl::internal::NaturalClientImpl<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::StrictTwoWayFieldsErr() const {
  return ::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayFieldsErr>(
      &client_base(), {}, &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayFieldsErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayFieldsErr_DynamicFlags,
      [](NaturalMessageEncoder& encoder) mutable {
        return ZX_OK;
      },
      [] (
          ::fidl::internal::ThenableBase* base,
          ::fidl::internal::NaturalMessageEncoder& encoder,
          ::fidl::internal::ResponseContext* response_context
      ) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}



::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayUnionErr>
fidl::internal::NaturalClientImpl<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::StrictTwoWayUnionErr() const {
  return ::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayUnionErr>(
      &client_base(), {}, &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayUnionErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayUnionErr_DynamicFlags,
      [](NaturalMessageEncoder& encoder) mutable {
        return ZX_OK;
      },
      [] (
          ::fidl::internal::ThenableBase* base,
          ::fidl::internal::NaturalMessageEncoder& encoder,
          ::fidl::internal::ResponseContext* response_context
      ) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}



::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayTableErr>
fidl::internal::NaturalClientImpl<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::StrictTwoWayTableErr() const {
  return ::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayTableErr>(
      &client_base(), {}, &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayTableErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayTableErr_DynamicFlags,
      [](NaturalMessageEncoder& encoder) mutable {
        return ZX_OK;
      },
      [] (
          ::fidl::internal::ThenableBase* base,
          ::fidl::internal::NaturalMessageEncoder& encoder,
          ::fidl::internal::ResponseContext* response_context
      ) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}



::fit::result<::fidl::OneWayError>
fidl::internal::NaturalClientImpl<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::StrictOneWay() const {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictOneWay_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictOneWay_DynamicFlags };
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  ::fidl::OneWayStatus status = client_base().SendOneWay(_encoded_message);
  return ::fidl::internal::ToFitxResult(status);
}


::fit::result<::fidl::OneWayError>
fidl::internal::NaturalClientImpl<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::FlexibleOneWay() const {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_FlexibleOneWay_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_FlexibleOneWay_DynamicFlags };
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  ::fidl::OneWayStatus status = client_base().SendOneWay(_encoded_message);
  return ::fidl::internal::ToFitxResult(status);
}
namespace test_unknowninteractions {

#endif  // __Fuchsia__

}  // namespace test_unknowninteractions

#ifdef __Fuchsia__



  ::fidl::Result<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWay>
  fidl::internal::NaturalSyncClientImpl<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::StrictTwoWay() {
    ::fidl::internal::NaturalMessageEncoder encoder{
        &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWay_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWay_DynamicFlags };
    ::fidl::OutgoingMessage msg = encoder.GetMessage();
    ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWay>> response_storage;
    return ::fidl::internal::DecodeResponseAndFoldError<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWay>(
        msg.Call(_client_end().handle(), response_storage.view()), nullptr);
  }


  ::fidl::Result<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayFields>
  fidl::internal::NaturalSyncClientImpl<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::StrictTwoWayFields() {
    ::fidl::internal::NaturalMessageEncoder encoder{
        &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayFields_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayFields_DynamicFlags };
    ::fidl::OutgoingMessage msg = encoder.GetMessage();
    ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayFields>> response_storage;
    return ::fidl::internal::DecodeResponseAndFoldError<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayFields>(
        msg.Call(_client_end().handle(), response_storage.view()), nullptr);
  }


  ::fidl::Result<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayUnion>
  fidl::internal::NaturalSyncClientImpl<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::StrictTwoWayUnion() {
    ::fidl::internal::NaturalMessageEncoder encoder{
        &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayUnion_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayUnion_DynamicFlags };
    ::fidl::OutgoingMessage msg = encoder.GetMessage();
    ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayUnion>> response_storage;
    return ::fidl::internal::DecodeResponseAndFoldError<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayUnion>(
        msg.Call(_client_end().handle(), response_storage.view()), nullptr);
  }


  ::fidl::Result<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayTable>
  fidl::internal::NaturalSyncClientImpl<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::StrictTwoWayTable() {
    ::fidl::internal::NaturalMessageEncoder encoder{
        &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayTable_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayTable_DynamicFlags };
    ::fidl::OutgoingMessage msg = encoder.GetMessage();
    ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayTable>> response_storage;
    return ::fidl::internal::DecodeResponseAndFoldError<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayTable>(
        msg.Call(_client_end().handle(), response_storage.view()), nullptr);
  }


  ::fidl::Result<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayErr>
  fidl::internal::NaturalSyncClientImpl<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::StrictTwoWayErr() {
    ::fidl::internal::NaturalMessageEncoder encoder{
        &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayErr_DynamicFlags };
    ::fidl::OutgoingMessage msg = encoder.GetMessage();
    ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayErr>> response_storage;
    return ::fidl::internal::DecodeResponseAndFoldError<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayErr>(
        msg.Call(_client_end().handle(), response_storage.view()), nullptr);
  }


  ::fidl::Result<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayFieldsErr>
  fidl::internal::NaturalSyncClientImpl<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::StrictTwoWayFieldsErr() {
    ::fidl::internal::NaturalMessageEncoder encoder{
        &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayFieldsErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayFieldsErr_DynamicFlags };
    ::fidl::OutgoingMessage msg = encoder.GetMessage();
    ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayFieldsErr>> response_storage;
    return ::fidl::internal::DecodeResponseAndFoldError<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayFieldsErr>(
        msg.Call(_client_end().handle(), response_storage.view()), nullptr);
  }


  ::fidl::Result<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayUnionErr>
  fidl::internal::NaturalSyncClientImpl<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::StrictTwoWayUnionErr() {
    ::fidl::internal::NaturalMessageEncoder encoder{
        &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayUnionErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayUnionErr_DynamicFlags };
    ::fidl::OutgoingMessage msg = encoder.GetMessage();
    ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayUnionErr>> response_storage;
    return ::fidl::internal::DecodeResponseAndFoldError<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayUnionErr>(
        msg.Call(_client_end().handle(), response_storage.view()), nullptr);
  }


  ::fidl::Result<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayTableErr>
  fidl::internal::NaturalSyncClientImpl<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::StrictTwoWayTableErr() {
    ::fidl::internal::NaturalMessageEncoder encoder{
        &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayTableErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayTableErr_DynamicFlags };
    ::fidl::OutgoingMessage msg = encoder.GetMessage();
    ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayTableErr>> response_storage;
    return ::fidl::internal::DecodeResponseAndFoldError<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayTableErr>(
        msg.Call(_client_end().handle(), response_storage.view()), nullptr);
  }




  ::fit::result<::fidl::OneWayError>
  fidl::internal::NaturalSyncClientImpl<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::StrictOneWay() {
    ::fidl::internal::NaturalMessageEncoder encoder{
        &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictOneWay_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictOneWay_DynamicFlags };
    ::fidl::OutgoingMessage msg = encoder.GetMessage();
    msg.Write(_client_end().handle());
    return ::fidl::internal::ToFitxResult(::fidl::OneWayStatus{msg});
  }


  ::fit::result<::fidl::OneWayError>
  fidl::internal::NaturalSyncClientImpl<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::FlexibleOneWay() {
    ::fidl::internal::NaturalMessageEncoder encoder{
        &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_FlexibleOneWay_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_FlexibleOneWay_DynamicFlags };
    ::fidl::OutgoingMessage msg = encoder.GetMessage();
    msg.Write(_client_end().handle());
    return ::fidl::internal::ToFitxResult(::fidl::OneWayStatus{msg});
  }



#endif  // __Fuchsia__



#ifdef __Fuchsia__



  ::fidl::Status fidl::SyncEventHandler<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::HandleOneEvent(
      ::fidl::UnownedClientEnd<::test_unknowninteractions::UnknownInteractionsAjarProtocol> client_end) {
      ::fidl::internal::IncomingEventsStorage<::test_unknowninteractions::UnknownInteractionsAjarProtocol> event_storage;
      fidl::internal::NaturalEventDispatcher<::test_unknowninteractions::UnknownInteractionsAjarProtocol> dispatcher{this};
      return HandleOneEventImpl_(client_end.channel(), event_storage.view(), dispatcher);
  }
  ::fidl::Status
  fidl::internal::NaturalEventDispatcher<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::DispatchEvent(
      ::fidl::IncomingHeaderAndMessage& msg,
      ::fidl::internal::MessageStorageViewBase* storage_view) {
    switch (msg.header()->ordinal) {
      case ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictEvent_Ordinal:
      {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessage(std::move(msg));
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        if (event_handler()) {;
          event_handler()->StrictEvent();
        }
        return ::fidl::Status::Ok();
      }
      case ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictEventFields_Ordinal:
      {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessage<::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventFieldsRequest>(std::move(msg));
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        if (event_handler()) {
            ::fidl::Event<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictEventFields> event = std::move(decoded.value());
          event_handler()->StrictEventFields(event);
        }
        return ::fidl::Status::Ok();
      }
      case ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictEventUnion_Ordinal:
      {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessage<::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventUnionRequest>(std::move(msg));
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        if (event_handler()) {
            ::fidl::Event<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictEventUnion> event = std::move(decoded.value());
          event_handler()->StrictEventUnion(event);
        }
        return ::fidl::Status::Ok();
      }
      case ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictEventTable_Ordinal:
      {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessage<::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventTableRequest>(std::move(msg));
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        if (event_handler()) {
            ::fidl::Event<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictEventTable> event = std::move(decoded.value());
          event_handler()->StrictEventTable(event);
        }
        return ::fidl::Status::Ok();
      }
      case ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_FlexibleEvent_Ordinal:
      {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessage(std::move(msg));
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        if (event_handler()) {;
          event_handler()->FlexibleEvent();
        }
        return ::fidl::Status::Ok();
      }
      case ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_FlexibleEventFields_Ordinal:
      {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessage<::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventFieldsRequest>(std::move(msg));
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        if (event_handler()) {
            ::fidl::Event<::test_unknowninteractions::UnknownInteractionsAjarProtocol::FlexibleEventFields> event = std::move(decoded.value());
          event_handler()->FlexibleEventFields(event);
        }
        return ::fidl::Status::Ok();
      }
      case ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_FlexibleEventUnion_Ordinal:
      {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessage<::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventUnionRequest>(std::move(msg));
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        if (event_handler()) {
            ::fidl::Event<::test_unknowninteractions::UnknownInteractionsAjarProtocol::FlexibleEventUnion> event = std::move(decoded.value());
          event_handler()->FlexibleEventUnion(event);
        }
        return ::fidl::Status::Ok();
      }
      case ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_FlexibleEventTable_Ordinal:
      {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessage<::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventTableRequest>(std::move(msg));
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        if (event_handler()) {
            ::fidl::Event<::test_unknowninteractions::UnknownInteractionsAjarProtocol::FlexibleEventTable> event = std::move(decoded.value());
          event_handler()->FlexibleEventTable(event);
        }
        return ::fidl::Status::Ok();
      }
      default:
        auto* hdr = msg.header();
        ::fidl::UnknownMethodType unknown_method_type =
            ::fidl::internal::UnknownMethodTypeFromHeader(hdr);
        bool is_flexible_interaction = ::fidl::IsFlexibleInteraction(hdr);
        auto ordinal = hdr->ordinal;
        std::move(msg).CloseHandles();
        if (is_flexible_interaction &&
            ::fidl::internal::CanHandleEvent(::test_unknowninteractions::UnknownInteractionsAjarProtocol::kOpenness, unknown_method_type)) {
          if (event_handler()) {
            ::fidl::UnknownEventMetadata<::test_unknowninteractions::UnknownInteractionsAjarProtocol> metadata {
              .event_ordinal = ordinal,
            };
            event_handler()->handle_unknown_event(metadata);
          }
          return ::fidl::Status::Ok();
        }
        return ::fidl::Status::UnknownOrdinal();
    }
  }

#endif  // __Fuchsia__




#ifdef __Fuchsia__


::fit::result<::fidl::OneWayError> fidl::internal::NaturalWeakEventSender<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::StrictEvent() {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictEvent_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictEvent_DynamicFlags };
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  return ::fidl::internal::ToFitxResult(_inner().SendEvent(_encoded_message));
}

::fit::result<::fidl::OneWayError> fidl::internal::NaturalEventSender<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::StrictEvent() {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictEvent_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictEvent_DynamicFlags };
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  _encoded_message.Write(_transport());
  return ::fidl::internal::ToFitxResult(::fidl::OneWayStatus{::fidl::Status{_encoded_message}});
}

  

::fit::result<::fidl::OneWayError> fidl::internal::NaturalWeakEventSender<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::StrictEventFields(const ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventFieldsRequest& payload) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictEventFields_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictEventFields_DynamicFlags };
  _encoder.EncodeBody(payload);
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  return ::fidl::internal::ToFitxResult(_inner().SendEvent(_encoded_message));
}

::fit::result<::fidl::OneWayError> fidl::internal::NaturalEventSender<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::StrictEventFields(const ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventFieldsRequest& payload) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictEventFields_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictEventFields_DynamicFlags };
  _encoder.EncodeBody(payload);
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  _encoded_message.Write(_transport());
  return ::fidl::internal::ToFitxResult(::fidl::OneWayStatus{::fidl::Status{_encoded_message}});
}

  

::fit::result<::fidl::OneWayError> fidl::internal::NaturalWeakEventSender<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::StrictEventUnion(const ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventUnionRequest& payload) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictEventUnion_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictEventUnion_DynamicFlags };
  _encoder.EncodeBody(payload);
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  return ::fidl::internal::ToFitxResult(_inner().SendEvent(_encoded_message));
}

::fit::result<::fidl::OneWayError> fidl::internal::NaturalEventSender<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::StrictEventUnion(const ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventUnionRequest& payload) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictEventUnion_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictEventUnion_DynamicFlags };
  _encoder.EncodeBody(payload);
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  _encoded_message.Write(_transport());
  return ::fidl::internal::ToFitxResult(::fidl::OneWayStatus{::fidl::Status{_encoded_message}});
}

  

::fit::result<::fidl::OneWayError> fidl::internal::NaturalWeakEventSender<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::StrictEventTable(const ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventTableRequest& payload) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictEventTable_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictEventTable_DynamicFlags };
  _encoder.EncodeBody(payload);
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  return ::fidl::internal::ToFitxResult(_inner().SendEvent(_encoded_message));
}

::fit::result<::fidl::OneWayError> fidl::internal::NaturalEventSender<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::StrictEventTable(const ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventTableRequest& payload) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictEventTable_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictEventTable_DynamicFlags };
  _encoder.EncodeBody(payload);
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  _encoded_message.Write(_transport());
  return ::fidl::internal::ToFitxResult(::fidl::OneWayStatus{::fidl::Status{_encoded_message}});
}

  

::fit::result<::fidl::OneWayError> fidl::internal::NaturalWeakEventSender<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::FlexibleEvent() {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_FlexibleEvent_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_FlexibleEvent_DynamicFlags };
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  return ::fidl::internal::ToFitxResult(_inner().SendEvent(_encoded_message));
}

::fit::result<::fidl::OneWayError> fidl::internal::NaturalEventSender<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::FlexibleEvent() {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_FlexibleEvent_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_FlexibleEvent_DynamicFlags };
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  _encoded_message.Write(_transport());
  return ::fidl::internal::ToFitxResult(::fidl::OneWayStatus{::fidl::Status{_encoded_message}});
}

  

::fit::result<::fidl::OneWayError> fidl::internal::NaturalWeakEventSender<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::FlexibleEventFields(const ::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventFieldsRequest& payload) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_FlexibleEventFields_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_FlexibleEventFields_DynamicFlags };
  _encoder.EncodeBody(payload);
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  return ::fidl::internal::ToFitxResult(_inner().SendEvent(_encoded_message));
}

::fit::result<::fidl::OneWayError> fidl::internal::NaturalEventSender<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::FlexibleEventFields(const ::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventFieldsRequest& payload) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_FlexibleEventFields_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_FlexibleEventFields_DynamicFlags };
  _encoder.EncodeBody(payload);
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  _encoded_message.Write(_transport());
  return ::fidl::internal::ToFitxResult(::fidl::OneWayStatus{::fidl::Status{_encoded_message}});
}

  

::fit::result<::fidl::OneWayError> fidl::internal::NaturalWeakEventSender<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::FlexibleEventUnion(const ::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventUnionRequest& payload) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_FlexibleEventUnion_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_FlexibleEventUnion_DynamicFlags };
  _encoder.EncodeBody(payload);
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  return ::fidl::internal::ToFitxResult(_inner().SendEvent(_encoded_message));
}

::fit::result<::fidl::OneWayError> fidl::internal::NaturalEventSender<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::FlexibleEventUnion(const ::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventUnionRequest& payload) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_FlexibleEventUnion_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_FlexibleEventUnion_DynamicFlags };
  _encoder.EncodeBody(payload);
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  _encoded_message.Write(_transport());
  return ::fidl::internal::ToFitxResult(::fidl::OneWayStatus{::fidl::Status{_encoded_message}});
}

  

::fit::result<::fidl::OneWayError> fidl::internal::NaturalWeakEventSender<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::FlexibleEventTable(const ::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventTableRequest& payload) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_FlexibleEventTable_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_FlexibleEventTable_DynamicFlags };
  _encoder.EncodeBody(payload);
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  return ::fidl::internal::ToFitxResult(_inner().SendEvent(_encoded_message));
}

::fit::result<::fidl::OneWayError> fidl::internal::NaturalEventSender<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::FlexibleEventTable(const ::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventTableRequest& payload) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_FlexibleEventTable_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_FlexibleEventTable_DynamicFlags };
  _encoder.EncodeBody(payload);
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  _encoded_message.Write(_transport());
  return ::fidl::internal::ToFitxResult(::fidl::OneWayStatus{::fidl::Status{_encoded_message}});
}

  

#endif  // __Fuchsia__




void fidl::internal::NaturalCompleterBase<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWay>::Reply() {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWay_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWay_DynamicFlags };
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}


void fidl::internal::NaturalCompleterBase<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayFields>::Reply(const ::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayFields>& response) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayFields_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayFields_DynamicFlags };
  _encoder.EncodeBody(
      ::fidl::internal::ResponseMessageConverter<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayFields>::IntoDomainObject(response));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}


void fidl::internal::NaturalCompleterBase<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayUnion>::Reply(const ::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayUnion>& response) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayUnion_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayUnion_DynamicFlags };
  _encoder.EncodeBody(
      ::fidl::internal::ResponseMessageConverter<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayUnion>::IntoDomainObject(response));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}


void fidl::internal::NaturalCompleterBase<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayTable>::Reply(const ::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayTable>& response) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayTable_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayTable_DynamicFlags };
  _encoder.EncodeBody(
      ::fidl::internal::ResponseMessageConverter<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayTable>::IntoDomainObject(response));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}


void fidl::internal::NaturalCompleterBase<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayErr>::Reply(const ::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayErr>& response) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayErr_DynamicFlags };
  _encoder.EncodeBody(
      ::fidl::internal::ResponseMessageConverter<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayErr>::IntoDomainObject(response));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}


void fidl::internal::NaturalCompleterBase<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayFieldsErr>::Reply(const ::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayFieldsErr>& response) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayFieldsErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayFieldsErr_DynamicFlags };
  _encoder.EncodeBody(
      ::fidl::internal::ResponseMessageConverter<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayFieldsErr>::IntoDomainObject(response));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}


void fidl::internal::NaturalCompleterBase<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayUnionErr>::Reply(const ::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayUnionErr>& response) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayUnionErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayUnionErr_DynamicFlags };
  _encoder.EncodeBody(
      ::fidl::internal::ResponseMessageConverter<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayUnionErr>::IntoDomainObject(response));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}


void fidl::internal::NaturalCompleterBase<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayTableErr>::Reply(const ::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayTableErr>& response) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayTableErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayTableErr_DynamicFlags };
  _encoder.EncodeBody(
      ::fidl::internal::ResponseMessageConverter<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayTableErr>::IntoDomainObject(response));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}

#ifdef __Fuchsia__



constexpr ::fidl::internal::MethodEntry fidl::internal::NaturalServerDispatcher<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::entries_[] = {
    { ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictOneWay_Ordinal,
      [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
         internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody(
            msg, metadata);
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        ::fidl::internal::NaturalCompleter<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictOneWay>::Sync completer(txn);
        static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsAjarProtocol>*>(interface)->StrictOneWay(
            
            completer);
        return ::fidl::Status::Ok();
      },
    },
    { ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_FlexibleOneWay_Ordinal,
      [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
         internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody(
            msg, metadata);
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        ::fidl::internal::NaturalCompleter<::test_unknowninteractions::UnknownInteractionsAjarProtocol::FlexibleOneWay>::Sync completer(txn);
        static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsAjarProtocol>*>(interface)->FlexibleOneWay(
            
            completer);
        return ::fidl::Status::Ok();
      },
    },
    { ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWay_Ordinal,
      [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
         internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody(
            msg, metadata);
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        ::fidl::internal::NaturalCompleter<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWay>::Sync completer(txn);
        static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsAjarProtocol>*>(interface)->StrictTwoWay(
            
            completer);
        return ::fidl::Status::Ok();
      },
    },
    { ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayFields_Ordinal,
      [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
         internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody(
            msg, metadata);
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        ::fidl::internal::NaturalCompleter<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayFields>::Sync completer(txn);
        static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsAjarProtocol>*>(interface)->StrictTwoWayFields(
            
            completer);
        return ::fidl::Status::Ok();
      },
    },
    { ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayUnion_Ordinal,
      [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
         internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody(
            msg, metadata);
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        ::fidl::internal::NaturalCompleter<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayUnion>::Sync completer(txn);
        static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsAjarProtocol>*>(interface)->StrictTwoWayUnion(
            
            completer);
        return ::fidl::Status::Ok();
      },
    },
    { ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayTable_Ordinal,
      [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
         internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody(
            msg, metadata);
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        ::fidl::internal::NaturalCompleter<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayTable>::Sync completer(txn);
        static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsAjarProtocol>*>(interface)->StrictTwoWayTable(
            
            completer);
        return ::fidl::Status::Ok();
      },
    },
    { ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayErr_Ordinal,
      [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
         internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody(
            msg, metadata);
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        ::fidl::internal::NaturalCompleter<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayErr>::Sync completer(txn);
        static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsAjarProtocol>*>(interface)->StrictTwoWayErr(
            
            completer);
        return ::fidl::Status::Ok();
      },
    },
    { ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayFieldsErr_Ordinal,
      [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
         internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody(
            msg, metadata);
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        ::fidl::internal::NaturalCompleter<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayFieldsErr>::Sync completer(txn);
        static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsAjarProtocol>*>(interface)->StrictTwoWayFieldsErr(
            
            completer);
        return ::fidl::Status::Ok();
      },
    },
    { ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayUnionErr_Ordinal,
      [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
         internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody(
            msg, metadata);
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        ::fidl::internal::NaturalCompleter<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayUnionErr>::Sync completer(txn);
        static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsAjarProtocol>*>(interface)->StrictTwoWayUnionErr(
            
            completer);
        return ::fidl::Status::Ok();
      },
    },
    { ::test_unknowninteractions::kUnknownInteractionsAjarProtocol_StrictTwoWayTableErr_Ordinal,
      [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
         internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody(
            msg, metadata);
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        ::fidl::internal::NaturalCompleter<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayTableErr>::Sync completer(txn);
        static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsAjarProtocol>*>(interface)->StrictTwoWayTableErr(
            
            completer);
        return ::fidl::Status::Ok();
      },
    },
};

const ::fidl::internal::MethodEntry* fidl::internal::NaturalServerDispatcher<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::entries_end_ =
    &entries_[10];
const ::fidl::internal::UnknownMethodHandlerEntry fidl::internal::NaturalServerDispatcher<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::unknown_method_handler_entry_ = {
  .openness = ::fidl::internal::Openness::kAjar,
  .dispatch = [](void* interface, uint64_t method_ordinal,
      ::fidl::UnknownMethodType unknown_method_type, ::fidl::Transaction* txn) {
    ::fidl::UnknownMethodCompleter::Sync completer(txn);
    static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsAjarProtocol>*>(interface)->handle_unknown_method(
        ::fidl::UnknownMethodMetadata<::test_unknowninteractions::UnknownInteractionsAjarProtocol> {
          .method_ordinal = method_ordinal,
          
      }, completer);
  },
  .send_reply = ::fidl::internal::SendChannelUnknownMethodReply,
};




void fidl::internal::NaturalServerDispatcher<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::Dispatch(::fidl::Server<::test_unknowninteractions::UnknownInteractionsAjarProtocol>* impl, ::fidl::IncomingHeaderAndMessage&& msg,
    internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
  ::fidl::internal::Dispatch(impl, msg, storage_view, txn, entries_, entries_end_, &unknown_method_handler_entry_);
}

void fidl::Server<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::dispatch_message(
    ::fidl::IncomingHeaderAndMessage&& msg, ::fidl::Transaction* txn,
    ::fidl::internal::MessageStorageViewBase* storage_view) {
  ::fidl::internal::NaturalServerDispatcher<::test_unknowninteractions::UnknownInteractionsAjarProtocol>::Dispatch(this, std::move(msg), storage_view, txn);
}

#endif  // __Fuchsia__


namespace test_unknowninteractions {

[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsClosedProtocol_StrictOneWay_Ordinal = 401526495318825508lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsClosedProtocol_StrictOneWay_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsClosedProtocol_StrictTwoWay_Ordinal = 6834828562275693047lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsClosedProtocol_StrictTwoWay_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsClosedProtocol_StrictTwoWayFields_Ordinal = 1379139029283639891lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsClosedProtocol_StrictTwoWayFields_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsClosedProtocol_StrictTwoWayUnion_Ordinal = 7544414847426850727lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsClosedProtocol_StrictTwoWayUnion_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsClosedProtocol_StrictTwoWayTable_Ordinal = 7947328131967870853lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsClosedProtocol_StrictTwoWayTable_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsClosedProtocol_StrictTwoWayErr_Ordinal = 5738532966428790074lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsClosedProtocol_StrictTwoWayErr_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsClosedProtocol_StrictTwoWayFieldsErr_Ordinal = 802395819586836733lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsClosedProtocol_StrictTwoWayFieldsErr_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsClosedProtocol_StrictTwoWayUnionErr_Ordinal = 925029359463709824lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsClosedProtocol_StrictTwoWayUnionErr_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsClosedProtocol_StrictTwoWayTableErr_Ordinal = 1260407702860823440lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsClosedProtocol_StrictTwoWayTableErr_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsClosedProtocol_StrictEvent_Ordinal = 760799297757210939lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsClosedProtocol_StrictEvent_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsClosedProtocol_StrictEventFields_Ordinal = 6736355582617074292lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsClosedProtocol_StrictEventFields_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsClosedProtocol_StrictEventUnion_Ordinal = 4288682345454280036lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsClosedProtocol_StrictEventUnion_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;


[[maybe_unused]]
constexpr inline uint64_t kUnknownInteractionsClosedProtocol_StrictEventTable_Ordinal = 2871682464255309246lu;



[[maybe_unused]]
constexpr inline ::fidl::MessageDynamicFlags kUnknownInteractionsClosedProtocol_StrictEventTable_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;

#ifdef __Fuchsia__
}  // namespace test_unknowninteractions

::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWay>
fidl::internal::NaturalClientImpl<::test_unknowninteractions::UnknownInteractionsClosedProtocol>::StrictTwoWay() const {
  return ::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWay>(
      &client_base(), {}, &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWay_Ordinal, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWay_DynamicFlags,
      [](NaturalMessageEncoder& encoder) mutable {
        return ZX_OK;
      },
      [] (
          ::fidl::internal::ThenableBase* base,
          ::fidl::internal::NaturalMessageEncoder& encoder,
          ::fidl::internal::ResponseContext* response_context
      ) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}



::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayFields>
fidl::internal::NaturalClientImpl<::test_unknowninteractions::UnknownInteractionsClosedProtocol>::StrictTwoWayFields() const {
  return ::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayFields>(
      &client_base(), {}, &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayFields_Ordinal, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayFields_DynamicFlags,
      [](NaturalMessageEncoder& encoder) mutable {
        return ZX_OK;
      },
      [] (
          ::fidl::internal::ThenableBase* base,
          ::fidl::internal::NaturalMessageEncoder& encoder,
          ::fidl::internal::ResponseContext* response_context
      ) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}



::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayUnion>
fidl::internal::NaturalClientImpl<::test_unknowninteractions::UnknownInteractionsClosedProtocol>::StrictTwoWayUnion() const {
  return ::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayUnion>(
      &client_base(), {}, &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayUnion_Ordinal, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayUnion_DynamicFlags,
      [](NaturalMessageEncoder& encoder) mutable {
        return ZX_OK;
      },
      [] (
          ::fidl::internal::ThenableBase* base,
          ::fidl::internal::NaturalMessageEncoder& encoder,
          ::fidl::internal::ResponseContext* response_context
      ) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}



::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayTable>
fidl::internal::NaturalClientImpl<::test_unknowninteractions::UnknownInteractionsClosedProtocol>::StrictTwoWayTable() const {
  return ::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayTable>(
      &client_base(), {}, &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayTable_Ordinal, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayTable_DynamicFlags,
      [](NaturalMessageEncoder& encoder) mutable {
        return ZX_OK;
      },
      [] (
          ::fidl::internal::ThenableBase* base,
          ::fidl::internal::NaturalMessageEncoder& encoder,
          ::fidl::internal::ResponseContext* response_context
      ) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}



::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayErr>
fidl::internal::NaturalClientImpl<::test_unknowninteractions::UnknownInteractionsClosedProtocol>::StrictTwoWayErr() const {
  return ::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayErr>(
      &client_base(), {}, &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayErr_DynamicFlags,
      [](NaturalMessageEncoder& encoder) mutable {
        return ZX_OK;
      },
      [] (
          ::fidl::internal::ThenableBase* base,
          ::fidl::internal::NaturalMessageEncoder& encoder,
          ::fidl::internal::ResponseContext* response_context
      ) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}



::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayFieldsErr>
fidl::internal::NaturalClientImpl<::test_unknowninteractions::UnknownInteractionsClosedProtocol>::StrictTwoWayFieldsErr() const {
  return ::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayFieldsErr>(
      &client_base(), {}, &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayFieldsErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayFieldsErr_DynamicFlags,
      [](NaturalMessageEncoder& encoder) mutable {
        return ZX_OK;
      },
      [] (
          ::fidl::internal::ThenableBase* base,
          ::fidl::internal::NaturalMessageEncoder& encoder,
          ::fidl::internal::ResponseContext* response_context
      ) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}



::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayUnionErr>
fidl::internal::NaturalClientImpl<::test_unknowninteractions::UnknownInteractionsClosedProtocol>::StrictTwoWayUnionErr() const {
  return ::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayUnionErr>(
      &client_base(), {}, &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayUnionErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayUnionErr_DynamicFlags,
      [](NaturalMessageEncoder& encoder) mutable {
        return ZX_OK;
      },
      [] (
          ::fidl::internal::ThenableBase* base,
          ::fidl::internal::NaturalMessageEncoder& encoder,
          ::fidl::internal::ResponseContext* response_context
      ) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}



::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayTableErr>
fidl::internal::NaturalClientImpl<::test_unknowninteractions::UnknownInteractionsClosedProtocol>::StrictTwoWayTableErr() const {
  return ::fidl::internal::NaturalThenable<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayTableErr>(
      &client_base(), {}, &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayTableErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayTableErr_DynamicFlags,
      [](NaturalMessageEncoder& encoder) mutable {
        return ZX_OK;
      },
      [] (
          ::fidl::internal::ThenableBase* base,
          ::fidl::internal::NaturalMessageEncoder& encoder,
          ::fidl::internal::ResponseContext* response_context
      ) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}



::fit::result<::fidl::OneWayError>
fidl::internal::NaturalClientImpl<::test_unknowninteractions::UnknownInteractionsClosedProtocol>::StrictOneWay() const {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictOneWay_Ordinal, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictOneWay_DynamicFlags };
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  ::fidl::OneWayStatus status = client_base().SendOneWay(_encoded_message);
  return ::fidl::internal::ToFitxResult(status);
}
namespace test_unknowninteractions {

#endif  // __Fuchsia__

}  // namespace test_unknowninteractions

#ifdef __Fuchsia__



  ::fidl::Result<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWay>
  fidl::internal::NaturalSyncClientImpl<::test_unknowninteractions::UnknownInteractionsClosedProtocol>::StrictTwoWay() {
    ::fidl::internal::NaturalMessageEncoder encoder{
        &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWay_Ordinal, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWay_DynamicFlags };
    ::fidl::OutgoingMessage msg = encoder.GetMessage();
    ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWay>> response_storage;
    return ::fidl::internal::DecodeResponseAndFoldError<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWay>(
        msg.Call(_client_end().handle(), response_storage.view()), nullptr);
  }


  ::fidl::Result<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayFields>
  fidl::internal::NaturalSyncClientImpl<::test_unknowninteractions::UnknownInteractionsClosedProtocol>::StrictTwoWayFields() {
    ::fidl::internal::NaturalMessageEncoder encoder{
        &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayFields_Ordinal, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayFields_DynamicFlags };
    ::fidl::OutgoingMessage msg = encoder.GetMessage();
    ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayFields>> response_storage;
    return ::fidl::internal::DecodeResponseAndFoldError<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayFields>(
        msg.Call(_client_end().handle(), response_storage.view()), nullptr);
  }


  ::fidl::Result<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayUnion>
  fidl::internal::NaturalSyncClientImpl<::test_unknowninteractions::UnknownInteractionsClosedProtocol>::StrictTwoWayUnion() {
    ::fidl::internal::NaturalMessageEncoder encoder{
        &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayUnion_Ordinal, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayUnion_DynamicFlags };
    ::fidl::OutgoingMessage msg = encoder.GetMessage();
    ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayUnion>> response_storage;
    return ::fidl::internal::DecodeResponseAndFoldError<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayUnion>(
        msg.Call(_client_end().handle(), response_storage.view()), nullptr);
  }


  ::fidl::Result<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayTable>
  fidl::internal::NaturalSyncClientImpl<::test_unknowninteractions::UnknownInteractionsClosedProtocol>::StrictTwoWayTable() {
    ::fidl::internal::NaturalMessageEncoder encoder{
        &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayTable_Ordinal, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayTable_DynamicFlags };
    ::fidl::OutgoingMessage msg = encoder.GetMessage();
    ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayTable>> response_storage;
    return ::fidl::internal::DecodeResponseAndFoldError<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayTable>(
        msg.Call(_client_end().handle(), response_storage.view()), nullptr);
  }


  ::fidl::Result<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayErr>
  fidl::internal::NaturalSyncClientImpl<::test_unknowninteractions::UnknownInteractionsClosedProtocol>::StrictTwoWayErr() {
    ::fidl::internal::NaturalMessageEncoder encoder{
        &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayErr_DynamicFlags };
    ::fidl::OutgoingMessage msg = encoder.GetMessage();
    ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayErr>> response_storage;
    return ::fidl::internal::DecodeResponseAndFoldError<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayErr>(
        msg.Call(_client_end().handle(), response_storage.view()), nullptr);
  }


  ::fidl::Result<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayFieldsErr>
  fidl::internal::NaturalSyncClientImpl<::test_unknowninteractions::UnknownInteractionsClosedProtocol>::StrictTwoWayFieldsErr() {
    ::fidl::internal::NaturalMessageEncoder encoder{
        &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayFieldsErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayFieldsErr_DynamicFlags };
    ::fidl::OutgoingMessage msg = encoder.GetMessage();
    ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayFieldsErr>> response_storage;
    return ::fidl::internal::DecodeResponseAndFoldError<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayFieldsErr>(
        msg.Call(_client_end().handle(), response_storage.view()), nullptr);
  }


  ::fidl::Result<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayUnionErr>
  fidl::internal::NaturalSyncClientImpl<::test_unknowninteractions::UnknownInteractionsClosedProtocol>::StrictTwoWayUnionErr() {
    ::fidl::internal::NaturalMessageEncoder encoder{
        &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayUnionErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayUnionErr_DynamicFlags };
    ::fidl::OutgoingMessage msg = encoder.GetMessage();
    ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayUnionErr>> response_storage;
    return ::fidl::internal::DecodeResponseAndFoldError<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayUnionErr>(
        msg.Call(_client_end().handle(), response_storage.view()), nullptr);
  }


  ::fidl::Result<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayTableErr>
  fidl::internal::NaturalSyncClientImpl<::test_unknowninteractions::UnknownInteractionsClosedProtocol>::StrictTwoWayTableErr() {
    ::fidl::internal::NaturalMessageEncoder encoder{
        &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayTableErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayTableErr_DynamicFlags };
    ::fidl::OutgoingMessage msg = encoder.GetMessage();
    ::fidl::internal::IncomingMessageStorage<::fidl::internal::TransactionalResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayTableErr>> response_storage;
    return ::fidl::internal::DecodeResponseAndFoldError<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayTableErr>(
        msg.Call(_client_end().handle(), response_storage.view()), nullptr);
  }




  ::fit::result<::fidl::OneWayError>
  fidl::internal::NaturalSyncClientImpl<::test_unknowninteractions::UnknownInteractionsClosedProtocol>::StrictOneWay() {
    ::fidl::internal::NaturalMessageEncoder encoder{
        &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictOneWay_Ordinal, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictOneWay_DynamicFlags };
    ::fidl::OutgoingMessage msg = encoder.GetMessage();
    msg.Write(_client_end().handle());
    return ::fidl::internal::ToFitxResult(::fidl::OneWayStatus{msg});
  }



#endif  // __Fuchsia__



#ifdef __Fuchsia__



  ::fidl::Status fidl::SyncEventHandler<::test_unknowninteractions::UnknownInteractionsClosedProtocol>::HandleOneEvent(
      ::fidl::UnownedClientEnd<::test_unknowninteractions::UnknownInteractionsClosedProtocol> client_end) {
      ::fidl::internal::IncomingEventsStorage<::test_unknowninteractions::UnknownInteractionsClosedProtocol> event_storage;
      fidl::internal::NaturalEventDispatcher<::test_unknowninteractions::UnknownInteractionsClosedProtocol> dispatcher{this};
      return HandleOneEventImpl_(client_end.channel(), event_storage.view(), dispatcher);
  }
  ::fidl::Status
  fidl::internal::NaturalEventDispatcher<::test_unknowninteractions::UnknownInteractionsClosedProtocol>::DispatchEvent(
      ::fidl::IncomingHeaderAndMessage& msg,
      ::fidl::internal::MessageStorageViewBase* storage_view) {
    switch (msg.header()->ordinal) {
      case ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictEvent_Ordinal:
      {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessage(std::move(msg));
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        if (event_handler()) {;
          event_handler()->StrictEvent();
        }
        return ::fidl::Status::Ok();
      }
      case ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictEventFields_Ordinal:
      {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessage<::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventFieldsRequest>(std::move(msg));
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        if (event_handler()) {
            ::fidl::Event<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictEventFields> event = std::move(decoded.value());
          event_handler()->StrictEventFields(event);
        }
        return ::fidl::Status::Ok();
      }
      case ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictEventUnion_Ordinal:
      {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessage<::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventUnionRequest>(std::move(msg));
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        if (event_handler()) {
            ::fidl::Event<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictEventUnion> event = std::move(decoded.value());
          event_handler()->StrictEventUnion(event);
        }
        return ::fidl::Status::Ok();
      }
      case ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictEventTable_Ordinal:
      {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessage<::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventTableRequest>(std::move(msg));
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        if (event_handler()) {
            ::fidl::Event<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictEventTable> event = std::move(decoded.value());
          event_handler()->StrictEventTable(event);
        }
        return ::fidl::Status::Ok();
      }
      default:
        std::move(msg).CloseHandles();
        return ::fidl::Status::UnknownOrdinal();
    }
  }

#endif  // __Fuchsia__




#ifdef __Fuchsia__


::fit::result<::fidl::OneWayError> fidl::internal::NaturalWeakEventSender<::test_unknowninteractions::UnknownInteractionsClosedProtocol>::StrictEvent() {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictEvent_Ordinal, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictEvent_DynamicFlags };
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  return ::fidl::internal::ToFitxResult(_inner().SendEvent(_encoded_message));
}

::fit::result<::fidl::OneWayError> fidl::internal::NaturalEventSender<::test_unknowninteractions::UnknownInteractionsClosedProtocol>::StrictEvent() {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictEvent_Ordinal, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictEvent_DynamicFlags };
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  _encoded_message.Write(_transport());
  return ::fidl::internal::ToFitxResult(::fidl::OneWayStatus{::fidl::Status{_encoded_message}});
}

  

::fit::result<::fidl::OneWayError> fidl::internal::NaturalWeakEventSender<::test_unknowninteractions::UnknownInteractionsClosedProtocol>::StrictEventFields(const ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventFieldsRequest& payload) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictEventFields_Ordinal, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictEventFields_DynamicFlags };
  _encoder.EncodeBody(payload);
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  return ::fidl::internal::ToFitxResult(_inner().SendEvent(_encoded_message));
}

::fit::result<::fidl::OneWayError> fidl::internal::NaturalEventSender<::test_unknowninteractions::UnknownInteractionsClosedProtocol>::StrictEventFields(const ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventFieldsRequest& payload) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictEventFields_Ordinal, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictEventFields_DynamicFlags };
  _encoder.EncodeBody(payload);
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  _encoded_message.Write(_transport());
  return ::fidl::internal::ToFitxResult(::fidl::OneWayStatus{::fidl::Status{_encoded_message}});
}

  

::fit::result<::fidl::OneWayError> fidl::internal::NaturalWeakEventSender<::test_unknowninteractions::UnknownInteractionsClosedProtocol>::StrictEventUnion(const ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventUnionRequest& payload) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictEventUnion_Ordinal, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictEventUnion_DynamicFlags };
  _encoder.EncodeBody(payload);
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  return ::fidl::internal::ToFitxResult(_inner().SendEvent(_encoded_message));
}

::fit::result<::fidl::OneWayError> fidl::internal::NaturalEventSender<::test_unknowninteractions::UnknownInteractionsClosedProtocol>::StrictEventUnion(const ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventUnionRequest& payload) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictEventUnion_Ordinal, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictEventUnion_DynamicFlags };
  _encoder.EncodeBody(payload);
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  _encoded_message.Write(_transport());
  return ::fidl::internal::ToFitxResult(::fidl::OneWayStatus{::fidl::Status{_encoded_message}});
}

  

::fit::result<::fidl::OneWayError> fidl::internal::NaturalWeakEventSender<::test_unknowninteractions::UnknownInteractionsClosedProtocol>::StrictEventTable(const ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventTableRequest& payload) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictEventTable_Ordinal, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictEventTable_DynamicFlags };
  _encoder.EncodeBody(payload);
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  return ::fidl::internal::ToFitxResult(_inner().SendEvent(_encoded_message));
}

::fit::result<::fidl::OneWayError> fidl::internal::NaturalEventSender<::test_unknowninteractions::UnknownInteractionsClosedProtocol>::StrictEventTable(const ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventTableRequest& payload) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictEventTable_Ordinal, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictEventTable_DynamicFlags };
  _encoder.EncodeBody(payload);
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  _encoded_message.Write(_transport());
  return ::fidl::internal::ToFitxResult(::fidl::OneWayStatus{::fidl::Status{_encoded_message}});
}

  

#endif  // __Fuchsia__




void fidl::internal::NaturalCompleterBase<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWay>::Reply() {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWay_Ordinal, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWay_DynamicFlags };
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}


void fidl::internal::NaturalCompleterBase<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayFields>::Reply(const ::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayFields>& response) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayFields_Ordinal, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayFields_DynamicFlags };
  _encoder.EncodeBody(
      ::fidl::internal::ResponseMessageConverter<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayFields>::IntoDomainObject(response));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}


void fidl::internal::NaturalCompleterBase<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayUnion>::Reply(const ::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayUnion>& response) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayUnion_Ordinal, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayUnion_DynamicFlags };
  _encoder.EncodeBody(
      ::fidl::internal::ResponseMessageConverter<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayUnion>::IntoDomainObject(response));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}


void fidl::internal::NaturalCompleterBase<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayTable>::Reply(const ::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayTable>& response) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayTable_Ordinal, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayTable_DynamicFlags };
  _encoder.EncodeBody(
      ::fidl::internal::ResponseMessageConverter<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayTable>::IntoDomainObject(response));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}


void fidl::internal::NaturalCompleterBase<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayErr>::Reply(const ::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayErr>& response) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayErr_DynamicFlags };
  _encoder.EncodeBody(
      ::fidl::internal::ResponseMessageConverter<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayErr>::IntoDomainObject(response));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}


void fidl::internal::NaturalCompleterBase<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayFieldsErr>::Reply(const ::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayFieldsErr>& response) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayFieldsErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayFieldsErr_DynamicFlags };
  _encoder.EncodeBody(
      ::fidl::internal::ResponseMessageConverter<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayFieldsErr>::IntoDomainObject(response));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}


void fidl::internal::NaturalCompleterBase<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayUnionErr>::Reply(const ::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayUnionErr>& response) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayUnionErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayUnionErr_DynamicFlags };
  _encoder.EncodeBody(
      ::fidl::internal::ResponseMessageConverter<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayUnionErr>::IntoDomainObject(response));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}


void fidl::internal::NaturalCompleterBase<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayTableErr>::Reply(const ::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayTableErr>& response) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayTableErr_Ordinal, ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayTableErr_DynamicFlags };
  _encoder.EncodeBody(
      ::fidl::internal::ResponseMessageConverter<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayTableErr>::IntoDomainObject(response));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}

#ifdef __Fuchsia__



constexpr ::fidl::internal::MethodEntry fidl::internal::NaturalServerDispatcher<::test_unknowninteractions::UnknownInteractionsClosedProtocol>::entries_[] = {
    { ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictOneWay_Ordinal,
      [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
         internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody(
            msg, metadata);
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        ::fidl::internal::NaturalCompleter<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictOneWay>::Sync completer(txn);
        static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsClosedProtocol>*>(interface)->StrictOneWay(
            
            completer);
        return ::fidl::Status::Ok();
      },
    },
    { ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWay_Ordinal,
      [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
         internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody(
            msg, metadata);
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        ::fidl::internal::NaturalCompleter<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWay>::Sync completer(txn);
        static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsClosedProtocol>*>(interface)->StrictTwoWay(
            
            completer);
        return ::fidl::Status::Ok();
      },
    },
    { ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayFields_Ordinal,
      [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
         internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody(
            msg, metadata);
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        ::fidl::internal::NaturalCompleter<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayFields>::Sync completer(txn);
        static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsClosedProtocol>*>(interface)->StrictTwoWayFields(
            
            completer);
        return ::fidl::Status::Ok();
      },
    },
    { ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayUnion_Ordinal,
      [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
         internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody(
            msg, metadata);
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        ::fidl::internal::NaturalCompleter<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayUnion>::Sync completer(txn);
        static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsClosedProtocol>*>(interface)->StrictTwoWayUnion(
            
            completer);
        return ::fidl::Status::Ok();
      },
    },
    { ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayTable_Ordinal,
      [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
         internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody(
            msg, metadata);
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        ::fidl::internal::NaturalCompleter<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayTable>::Sync completer(txn);
        static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsClosedProtocol>*>(interface)->StrictTwoWayTable(
            
            completer);
        return ::fidl::Status::Ok();
      },
    },
    { ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayErr_Ordinal,
      [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
         internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody(
            msg, metadata);
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        ::fidl::internal::NaturalCompleter<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayErr>::Sync completer(txn);
        static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsClosedProtocol>*>(interface)->StrictTwoWayErr(
            
            completer);
        return ::fidl::Status::Ok();
      },
    },
    { ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayFieldsErr_Ordinal,
      [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
         internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody(
            msg, metadata);
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        ::fidl::internal::NaturalCompleter<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayFieldsErr>::Sync completer(txn);
        static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsClosedProtocol>*>(interface)->StrictTwoWayFieldsErr(
            
            completer);
        return ::fidl::Status::Ok();
      },
    },
    { ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayUnionErr_Ordinal,
      [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
         internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody(
            msg, metadata);
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        ::fidl::internal::NaturalCompleter<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayUnionErr>::Sync completer(txn);
        static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsClosedProtocol>*>(interface)->StrictTwoWayUnionErr(
            
            completer);
        return ::fidl::Status::Ok();
      },
    },
    { ::test_unknowninteractions::kUnknownInteractionsClosedProtocol_StrictTwoWayTableErr_Ordinal,
      [](void* interface, ::fidl::EncodedMessage& msg, ::fidl::WireFormatMetadata metadata,
         internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
        ::fit::result decoded = ::fidl::internal::DecodeTransactionalMessageWithoutBody(
            msg, metadata);
        if (decoded.is_error()) {
          return decoded.error_value();
        }
        ::fidl::internal::NaturalCompleter<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayTableErr>::Sync completer(txn);
        static_cast<::fidl::Server<::test_unknowninteractions::UnknownInteractionsClosedProtocol>*>(interface)->StrictTwoWayTableErr(
            
            completer);
        return ::fidl::Status::Ok();
      },
    },
};

const ::fidl::internal::MethodEntry* fidl::internal::NaturalServerDispatcher<::test_unknowninteractions::UnknownInteractionsClosedProtocol>::entries_end_ =
    &entries_[9];



void fidl::internal::NaturalServerDispatcher<::test_unknowninteractions::UnknownInteractionsClosedProtocol>::Dispatch(::fidl::Server<::test_unknowninteractions::UnknownInteractionsClosedProtocol>* impl, ::fidl::IncomingHeaderAndMessage&& msg,
    internal::MessageStorageViewBase* storage_view, ::fidl::Transaction* txn) {
  ::fidl::internal::Dispatch(impl, msg, storage_view, txn, entries_, entries_end_, &unknown_method_handler_entry_);
}

void fidl::Server<::test_unknowninteractions::UnknownInteractionsClosedProtocol>::dispatch_message(
    ::fidl::IncomingHeaderAndMessage&& msg, ::fidl::Transaction* txn,
    ::fidl::internal::MessageStorageViewBase* storage_view) {
  ::fidl::internal::NaturalServerDispatcher<::test_unknowninteractions::UnknownInteractionsClosedProtocol>::Dispatch(this, std::move(msg), storage_view, txn);
}

#endif  // __Fuchsia__



#pragma clang diagnostic pop





