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

// fidl_experiment = output_index_json

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

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

namespace fidl {
namespace internal {




::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayFieldsResponse, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayFieldsResponse src) {
  return ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsResponse(WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field)));
}
::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayFieldsResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayFieldsResponse, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsResponse src) {
  return ::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayFieldsResponse{
      .some_field = WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field())),
  };
}




::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayErrResponse, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayErrResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayErrResponse src) {
  return ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayErrResponse(WireNaturalConversionTraits<uint8_t, uint8_t>::ToNatural(std::move(src.__reserved)));
}
::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayErrResponse, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayErrResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayErrResponse src) {
  return ::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayErrResponse{
      .__reserved = WireNaturalConversionTraits<uint8_t, uint8_t>::ToWire(arena, std::move(src.__reserved())),
  };
}




::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayFieldsErrResponse, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayFieldsErrResponse src) {
  return ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResponse(WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field)));
}
::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayFieldsErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayFieldsErrResponse, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResponse src) {
  return ::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayFieldsErrResponse{
      .some_field = WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field())),
  };
}




::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayResponse, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayResponse src) {
  return ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayResponse(WireNaturalConversionTraits<uint8_t, uint8_t>::ToNatural(std::move(src.__reserved)));
}
::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayResponse, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayResponse src) {
  return ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayResponse{
      .__reserved = WireNaturalConversionTraits<uint8_t, uint8_t>::ToWire(arena, std::move(src.__reserved())),
  };
}




::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayFieldsResponse, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayFieldsResponse src) {
  return ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsResponse(WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field)));
}
::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayFieldsResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayFieldsResponse, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsResponse src) {
  return ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayFieldsResponse{
      .some_field = WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field())),
  };
}




::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayErrResponse, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayErrResponse src) {
  return ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResponse(WireNaturalConversionTraits<uint8_t, uint8_t>::ToNatural(std::move(src.__reserved)));
}
::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayErrResponse, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResponse src) {
  return ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayErrResponse{
      .__reserved = WireNaturalConversionTraits<uint8_t, uint8_t>::ToWire(arena, std::move(src.__reserved())),
  };
}




::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResponse, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResponse src) {
  return ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResponse(WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field)));
}
::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResponse, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResponse src) {
  return ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResponse{
      .some_field = WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field())),
  };
}




::test_unknowninteractions::UnknownInteractionsProtocolStrictEventFieldsRequest WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictEventFieldsRequest, ::test_unknowninteractions::UnknownInteractionsProtocolStrictEventFieldsRequest>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictEventFieldsRequest src) {
  return ::test_unknowninteractions::UnknownInteractionsProtocolStrictEventFieldsRequest(WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field)));
}
::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictEventFieldsRequest WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictEventFieldsRequest, ::test_unknowninteractions::UnknownInteractionsProtocolStrictEventFieldsRequest>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsProtocolStrictEventFieldsRequest src) {
  return ::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictEventFieldsRequest{
      .some_field = WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field())),
  };
}




::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventFieldsRequest WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleEventFieldsRequest, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventFieldsRequest>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleEventFieldsRequest src) {
  return ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventFieldsRequest(WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field)));
}
::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleEventFieldsRequest WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleEventFieldsRequest, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventFieldsRequest>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventFieldsRequest src) {
  return ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleEventFieldsRequest{
      .some_field = WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field())),
  };
}




::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayFieldsResponse, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayFieldsResponse src) {
  return ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsResponse(WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field)));
}
::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayFieldsResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayFieldsResponse, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsResponse src) {
  return ::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayFieldsResponse{
      .some_field = WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field())),
  };
}




::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayErrResponse, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayErrResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayErrResponse src) {
  return ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayErrResponse(WireNaturalConversionTraits<uint8_t, uint8_t>::ToNatural(std::move(src.__reserved)));
}
::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayErrResponse, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayErrResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayErrResponse src) {
  return ::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayErrResponse{
      .__reserved = WireNaturalConversionTraits<uint8_t, uint8_t>::ToWire(arena, std::move(src.__reserved())),
  };
}




::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResponse, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResponse src) {
  return ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResponse(WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field)));
}
::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResponse, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResponse src) {
  return ::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResponse{
      .some_field = WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field())),
  };
}




::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventFieldsRequest WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictEventFieldsRequest, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventFieldsRequest>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictEventFieldsRequest src) {
  return ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventFieldsRequest(WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field)));
}
::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictEventFieldsRequest WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictEventFieldsRequest, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventFieldsRequest>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventFieldsRequest src) {
  return ::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictEventFieldsRequest{
      .some_field = WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field())),
  };
}




::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventFieldsRequest WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolFlexibleEventFieldsRequest, ::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventFieldsRequest>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolFlexibleEventFieldsRequest src) {
  return ::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventFieldsRequest(WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field)));
}
::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolFlexibleEventFieldsRequest WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolFlexibleEventFieldsRequest, ::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventFieldsRequest>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventFieldsRequest src) {
  return ::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolFlexibleEventFieldsRequest{
      .some_field = WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field())),
  };
}




::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayFieldsResponse, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayFieldsResponse src) {
  return ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsResponse(WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field)));
}
::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayFieldsResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayFieldsResponse, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsResponse src) {
  return ::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayFieldsResponse{
      .some_field = WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field())),
  };
}




::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayErrResponse, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayErrResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayErrResponse src) {
  return ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayErrResponse(WireNaturalConversionTraits<uint8_t, uint8_t>::ToNatural(std::move(src.__reserved)));
}
::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayErrResponse, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayErrResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayErrResponse src) {
  return ::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayErrResponse{
      .__reserved = WireNaturalConversionTraits<uint8_t, uint8_t>::ToWire(arena, std::move(src.__reserved())),
  };
}




::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResponse, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResponse src) {
  return ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResponse(WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field)));
}
::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResponse, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResponse src) {
  return ::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResponse{
      .some_field = WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field())),
  };
}




::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventFieldsRequest WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictEventFieldsRequest, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventFieldsRequest>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictEventFieldsRequest src) {
  return ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventFieldsRequest(WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field)));
}
::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictEventFieldsRequest WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictEventFieldsRequest, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventFieldsRequest>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventFieldsRequest src) {
  return ::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictEventFieldsRequest{
      .some_field = WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field())),
  };
}




::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayFieldsResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayFieldsResponse src) {
  return ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsResponse(WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field)));
}
::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayFieldsResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayFieldsResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsResponse src) {
  return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayFieldsResponse{
      .some_field = WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field())),
  };
}




::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayErrResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayErrResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayErrResponse src) {
  return ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayErrResponse(WireNaturalConversionTraits<uint8_t, uint8_t>::ToNatural(std::move(src.__reserved)));
}
::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayErrResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayErrResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayErrResponse src) {
  return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayErrResponse{
      .__reserved = WireNaturalConversionTraits<uint8_t, uint8_t>::ToWire(arena, std::move(src.__reserved())),
  };
}




::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResponse src) {
  return ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResponse(WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field)));
}
::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResponse src) {
  return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResponse{
      .some_field = WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field())),
  };
}




::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayResponse src) {
  return ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayResponse(WireNaturalConversionTraits<uint8_t, uint8_t>::ToNatural(std::move(src.__reserved)));
}
::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayResponse src) {
  return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayResponse{
      .__reserved = WireNaturalConversionTraits<uint8_t, uint8_t>::ToWire(arena, std::move(src.__reserved())),
  };
}




::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResponse src) {
  return ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResponse(WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field)));
}
::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResponse src) {
  return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResponse{
      .some_field = WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field())),
  };
}




::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResponse src) {
  return ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResponse(WireNaturalConversionTraits<uint8_t, uint8_t>::ToNatural(std::move(src.__reserved)));
}
::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResponse src) {
  return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResponse{
      .__reserved = WireNaturalConversionTraits<uint8_t, uint8_t>::ToWire(arena, std::move(src.__reserved())),
  };
}




::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResponse src) {
  return ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResponse(WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field)));
}
::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResponse src) {
  return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResponse{
      .some_field = WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field())),
  };
}




::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsResponse, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsResponse src) {
  return ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsResponse(WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field)));
}
::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsResponse, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsResponse src) {
  return ::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsResponse{
      .some_field = WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field())),
  };
}




::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResponse, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResponse src) {
  return ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResponse(WireNaturalConversionTraits<uint8_t, uint8_t>::ToNatural(std::move(src.__reserved)));
}
::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResponse, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResponse src) {
  return ::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResponse{
      .__reserved = WireNaturalConversionTraits<uint8_t, uint8_t>::ToWire(arena, std::move(src.__reserved())),
  };
}




::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResponse, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResponse src) {
  return ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResponse(WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field)));
}
::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResponse, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResponse src) {
  return ::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResponse{
      .some_field = WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field())),
  };
}




::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsResponse, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsResponse src) {
  return ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsResponse(WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field)));
}
::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsResponse, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsResponse src) {
  return ::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsResponse{
      .some_field = WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field())),
  };
}




::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResponse, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResponse src) {
  return ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResponse(WireNaturalConversionTraits<uint8_t, uint8_t>::ToNatural(std::move(src.__reserved)));
}
::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResponse, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResponse src) {
  return ::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResponse{
      .__reserved = WireNaturalConversionTraits<uint8_t, uint8_t>::ToWire(arena, std::move(src.__reserved())),
  };
}




::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResponse, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResponse src) {
  return ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResponse(WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field)));
}
::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResponse, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResponse src) {
  return ::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResponse{
      .some_field = WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field())),
  };
}





::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayTableResponse, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayTableResponse src) {
  ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableResponse dst;
  if (src.has_some_field()) {
    dst.some_field() =
      WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field()));
  }

  return dst;
}
::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayTableResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayTableResponse, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableResponse src) {
  auto builder = ::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayTableResponse::Builder(arena);
  if (src.some_field().has_value()) {
    builder.some_field(
      WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
  }
  return builder.Build();
}




::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayTableErrResponse, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayTableErrResponse src) {
  ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResponse dst;
  if (src.has_some_field()) {
    dst.some_field() =
      WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field()));
  }

  return dst;
}
::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayTableErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayTableErrResponse, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResponse src) {
  auto builder = ::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayTableErrResponse::Builder(arena);
  if (src.some_field().has_value()) {
    builder.some_field(
      WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
  }
  return builder.Build();
}




::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayTableResponse, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayTableResponse src) {
  ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableResponse dst;
  if (src.has_some_field()) {
    dst.some_field() =
      WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field()));
  }

  return dst;
}
::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayTableResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayTableResponse, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableResponse src) {
  auto builder = ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayTableResponse::Builder(arena);
  if (src.some_field().has_value()) {
    builder.some_field(
      WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
  }
  return builder.Build();
}




::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayTableErrResponse, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayTableErrResponse src) {
  ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResponse dst;
  if (src.has_some_field()) {
    dst.some_field() =
      WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field()));
  }

  return dst;
}
::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayTableErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayTableErrResponse, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResponse src) {
  auto builder = ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayTableErrResponse::Builder(arena);
  if (src.some_field().has_value()) {
    builder.some_field(
      WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
  }
  return builder.Build();
}




::test_unknowninteractions::UnknownInteractionsProtocolStrictEventTableRequest WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictEventTableRequest, ::test_unknowninteractions::UnknownInteractionsProtocolStrictEventTableRequest>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictEventTableRequest src) {
  ::test_unknowninteractions::UnknownInteractionsProtocolStrictEventTableRequest dst;
  if (src.has_some_field()) {
    dst.some_field() =
      WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field()));
  }

  return dst;
}
::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictEventTableRequest WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictEventTableRequest, ::test_unknowninteractions::UnknownInteractionsProtocolStrictEventTableRequest>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsProtocolStrictEventTableRequest src) {
  auto builder = ::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictEventTableRequest::Builder(arena);
  if (src.some_field().has_value()) {
    builder.some_field(
      WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
  }
  return builder.Build();
}




::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventTableRequest WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleEventTableRequest, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventTableRequest>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleEventTableRequest src) {
  ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventTableRequest dst;
  if (src.has_some_field()) {
    dst.some_field() =
      WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field()));
  }

  return dst;
}
::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleEventTableRequest WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleEventTableRequest, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventTableRequest>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventTableRequest src) {
  auto builder = ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleEventTableRequest::Builder(arena);
  if (src.some_field().has_value()) {
    builder.some_field(
      WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
  }
  return builder.Build();
}




::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayTableResponse, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayTableResponse src) {
  ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableResponse dst;
  if (src.has_some_field()) {
    dst.some_field() =
      WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field()));
  }

  return dst;
}
::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayTableResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayTableResponse, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableResponse src) {
  auto builder = ::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayTableResponse::Builder(arena);
  if (src.some_field().has_value()) {
    builder.some_field(
      WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
  }
  return builder.Build();
}




::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResponse, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResponse src) {
  ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResponse dst;
  if (src.has_some_field()) {
    dst.some_field() =
      WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field()));
  }

  return dst;
}
::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResponse, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResponse src) {
  auto builder = ::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResponse::Builder(arena);
  if (src.some_field().has_value()) {
    builder.some_field(
      WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
  }
  return builder.Build();
}




::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventTableRequest WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictEventTableRequest, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventTableRequest>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictEventTableRequest src) {
  ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventTableRequest dst;
  if (src.has_some_field()) {
    dst.some_field() =
      WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field()));
  }

  return dst;
}
::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictEventTableRequest WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictEventTableRequest, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventTableRequest>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventTableRequest src) {
  auto builder = ::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictEventTableRequest::Builder(arena);
  if (src.some_field().has_value()) {
    builder.some_field(
      WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
  }
  return builder.Build();
}




::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventTableRequest WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolFlexibleEventTableRequest, ::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventTableRequest>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolFlexibleEventTableRequest src) {
  ::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventTableRequest dst;
  if (src.has_some_field()) {
    dst.some_field() =
      WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field()));
  }

  return dst;
}
::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolFlexibleEventTableRequest WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolFlexibleEventTableRequest, ::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventTableRequest>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventTableRequest src) {
  auto builder = ::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolFlexibleEventTableRequest::Builder(arena);
  if (src.some_field().has_value()) {
    builder.some_field(
      WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
  }
  return builder.Build();
}




::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayTableResponse, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayTableResponse src) {
  ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableResponse dst;
  if (src.has_some_field()) {
    dst.some_field() =
      WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field()));
  }

  return dst;
}
::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayTableResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayTableResponse, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableResponse src) {
  auto builder = ::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayTableResponse::Builder(arena);
  if (src.some_field().has_value()) {
    builder.some_field(
      WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
  }
  return builder.Build();
}




::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResponse, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResponse src) {
  ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResponse dst;
  if (src.has_some_field()) {
    dst.some_field() =
      WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field()));
  }

  return dst;
}
::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResponse, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResponse src) {
  auto builder = ::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResponse::Builder(arena);
  if (src.some_field().has_value()) {
    builder.some_field(
      WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
  }
  return builder.Build();
}




::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventTableRequest WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictEventTableRequest, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventTableRequest>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictEventTableRequest src) {
  ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventTableRequest dst;
  if (src.has_some_field()) {
    dst.some_field() =
      WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field()));
  }

  return dst;
}
::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictEventTableRequest WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictEventTableRequest, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventTableRequest>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventTableRequest src) {
  auto builder = ::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictEventTableRequest::Builder(arena);
  if (src.some_field().has_value()) {
    builder.some_field(
      WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
  }
  return builder.Build();
}




::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayTableResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayTableResponse src) {
  ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableResponse dst;
  if (src.has_some_field()) {
    dst.some_field() =
      WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field()));
  }

  return dst;
}
::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayTableResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayTableResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableResponse src) {
  auto builder = ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayTableResponse::Builder(arena);
  if (src.some_field().has_value()) {
    builder.some_field(
      WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
  }
  return builder.Build();
}




::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResponse src) {
  ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResponse dst;
  if (src.has_some_field()) {
    dst.some_field() =
      WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field()));
  }

  return dst;
}
::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResponse src) {
  auto builder = ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResponse::Builder(arena);
  if (src.some_field().has_value()) {
    builder.some_field(
      WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
  }
  return builder.Build();
}




::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResponse src) {
  ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResponse dst;
  if (src.has_some_field()) {
    dst.some_field() =
      WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field()));
  }

  return dst;
}
::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResponse src) {
  auto builder = ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResponse::Builder(arena);
  if (src.some_field().has_value()) {
    builder.some_field(
      WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
  }
  return builder.Build();
}




::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResponse src) {
  ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResponse dst;
  if (src.has_some_field()) {
    dst.some_field() =
      WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field()));
  }

  return dst;
}
::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResponse src) {
  auto builder = ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResponse::Builder(arena);
  if (src.some_field().has_value()) {
    builder.some_field(
      WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
  }
  return builder.Build();
}




::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableResponse, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableResponse src) {
  ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableResponse dst;
  if (src.has_some_field()) {
    dst.some_field() =
      WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field()));
  }

  return dst;
}
::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableResponse, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableResponse src) {
  auto builder = ::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableResponse::Builder(arena);
  if (src.some_field().has_value()) {
    builder.some_field(
      WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
  }
  return builder.Build();
}




::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResponse, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResponse src) {
  ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResponse dst;
  if (src.has_some_field()) {
    dst.some_field() =
      WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field()));
  }

  return dst;
}
::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResponse, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResponse src) {
  auto builder = ::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResponse::Builder(arena);
  if (src.some_field().has_value()) {
    builder.some_field(
      WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
  }
  return builder.Build();
}




::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableResponse, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableResponse src) {
  ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableResponse dst;
  if (src.has_some_field()) {
    dst.some_field() =
      WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field()));
  }

  return dst;
}
::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableResponse, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableResponse src) {
  auto builder = ::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableResponse::Builder(arena);
  if (src.some_field().has_value()) {
    builder.some_field(
      WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
  }
  return builder.Build();
}




::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResponse, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResponse src) {
  ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResponse dst;
  if (src.has_some_field()) {
    dst.some_field() =
      WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field()));
  }

  return dst;
}
::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResponse, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResponse src) {
  auto builder = ::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResponse::Builder(arena);
  if (src.some_field().has_value()) {
    builder.some_field(
      WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
  }
  return builder.Build();
}







::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayUnionResponse, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayUnionResponse src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayUnionResponse::Tag::kSomeField:
      return ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionResponse::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field())));
    default:
      return ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionResponse(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
  }
}
::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayUnionResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayUnionResponse, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionResponse src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionResponse::Tag::kSomeField:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayUnionResponse::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
    default:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayUnionResponse();
  }
}






::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayErrResult, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayErrResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayErrResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayErrResponse, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayErrResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayErrResult::Tag::kErr:
      return ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayErrResult, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayErrResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayErrResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayErrResponse, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayErrResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayErrResult::Tag::kErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayFieldsErrResult, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayFieldsErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayFieldsErrResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayFieldsErrResponse, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayFieldsErrResult::Tag::kErr:
      return ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayFieldsErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayFieldsErrResult, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayFieldsErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayFieldsErrResponse, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResult::Tag::kErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayFieldsErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayUnionErrResponse, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayUnionErrResponse src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayUnionErrResponse::Tag::kSomeField:
      return ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResponse::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field())));
    default:
      return ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResponse(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
  }
}
::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayUnionErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayUnionErrResponse, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResponse src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResponse::Tag::kSomeField:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayUnionErrResponse::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
    default:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayUnionErrResponse();
  }
}






::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayUnionErrResult, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayUnionErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayUnionErrResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayUnionErrResponse, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayUnionErrResult::Tag::kErr:
      return ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayUnionErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayUnionErrResult, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayUnionErrResult::WithResponse(arena,
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayUnionErrResponse, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResult::Tag::kErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayUnionErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayTableErrResult, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayTableErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayTableErrResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayTableErrResponse, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayTableErrResult::Tag::kErr:
      return ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayTableErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayTableErrResult, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayTableErrResult::WithResponse(arena,
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayTableErrResponse, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResult::Tag::kErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayTableErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayResult, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayResponse, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayResult::Tag::kFrameworkErr:
      return ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayResult::WithFrameworkErr(
        WireNaturalConversionTraits<::fidl::internal::FrameworkErr, ::fidl::internal::FrameworkErr>::ToNatural(std::move(src.framework_err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayResult, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayResponse, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayResult::Tag::kFrameworkErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayResult::WithFrameworkErr(
        WireNaturalConversionTraits<::fidl::internal::FrameworkErr, ::fidl::internal::FrameworkErr>::ToWire(arena, std::move(src.framework_err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayFieldsResult, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayFieldsResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayFieldsResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayFieldsResponse, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayFieldsResult::Tag::kFrameworkErr:
      return ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsResult::WithFrameworkErr(
        WireNaturalConversionTraits<::fidl::internal::FrameworkErr, ::fidl::internal::FrameworkErr>::ToNatural(std::move(src.framework_err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayFieldsResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayFieldsResult, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayFieldsResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayFieldsResponse, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsResult::Tag::kFrameworkErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayFieldsResult::WithFrameworkErr(
        WireNaturalConversionTraits<::fidl::internal::FrameworkErr, ::fidl::internal::FrameworkErr>::ToWire(arena, std::move(src.framework_err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayUnionResponse, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayUnionResponse src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayUnionResponse::Tag::kSomeField:
      return ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResponse::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field())));
    default:
      return ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResponse(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
  }
}
::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayUnionResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayUnionResponse, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResponse src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResponse::Tag::kSomeField:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayUnionResponse::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
    default:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayUnionResponse();
  }
}






::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayUnionResult, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayUnionResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayUnionResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayUnionResponse, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayUnionResult::Tag::kFrameworkErr:
      return ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResult::WithFrameworkErr(
        WireNaturalConversionTraits<::fidl::internal::FrameworkErr, ::fidl::internal::FrameworkErr>::ToNatural(std::move(src.framework_err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayUnionResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayUnionResult, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayUnionResult::WithResponse(arena,
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayUnionResponse, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResult::Tag::kFrameworkErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayUnionResult::WithFrameworkErr(
        WireNaturalConversionTraits<::fidl::internal::FrameworkErr, ::fidl::internal::FrameworkErr>::ToWire(arena, std::move(src.framework_err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayTableResult, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayTableResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayTableResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayTableResponse, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayTableResult::Tag::kFrameworkErr:
      return ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableResult::WithFrameworkErr(
        WireNaturalConversionTraits<::fidl::internal::FrameworkErr, ::fidl::internal::FrameworkErr>::ToNatural(std::move(src.framework_err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayTableResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayTableResult, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayTableResult::WithResponse(arena,
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayTableResponse, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableResult::Tag::kFrameworkErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayTableResult::WithFrameworkErr(
        WireNaturalConversionTraits<::fidl::internal::FrameworkErr, ::fidl::internal::FrameworkErr>::ToWire(arena, std::move(src.framework_err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayErrResult, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayErrResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayErrResponse, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayErrResult::Tag::kErr:
      return ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.err())));
    case ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayErrResult::Tag::kFrameworkErr:
      return ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResult::WithFrameworkErr(
        WireNaturalConversionTraits<::fidl::internal::FrameworkErr, ::fidl::internal::FrameworkErr>::ToNatural(std::move(src.framework_err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayErrResult, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayErrResponse, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResult::Tag::kErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.err().value())));
    case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResult::Tag::kFrameworkErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayErrResult::WithFrameworkErr(
        WireNaturalConversionTraits<::fidl::internal::FrameworkErr, ::fidl::internal::FrameworkErr>::ToWire(arena, std::move(src.framework_err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResult, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResponse, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResult::Tag::kErr:
      return ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.err())));
    case ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResult::Tag::kFrameworkErr:
      return ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResult::WithFrameworkErr(
        WireNaturalConversionTraits<::fidl::internal::FrameworkErr, ::fidl::internal::FrameworkErr>::ToNatural(std::move(src.framework_err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResult, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResponse, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResult::Tag::kErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.err().value())));
    case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResult::Tag::kFrameworkErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResult::WithFrameworkErr(
        WireNaturalConversionTraits<::fidl::internal::FrameworkErr, ::fidl::internal::FrameworkErr>::ToWire(arena, std::move(src.framework_err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResponse, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResponse src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResponse::Tag::kSomeField:
      return ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResponse::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field())));
    default:
      return ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResponse(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
  }
}
::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResponse, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResponse src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResponse::Tag::kSomeField:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResponse::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
    default:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResponse();
  }
}






::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResult, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResponse, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResult::Tag::kErr:
      return ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.err())));
    case ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResult::Tag::kFrameworkErr:
      return ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResult::WithFrameworkErr(
        WireNaturalConversionTraits<::fidl::internal::FrameworkErr, ::fidl::internal::FrameworkErr>::ToNatural(std::move(src.framework_err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResult, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResult::WithResponse(arena,
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResponse, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResult::Tag::kErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.err().value())));
    case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResult::Tag::kFrameworkErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResult::WithFrameworkErr(
        WireNaturalConversionTraits<::fidl::internal::FrameworkErr, ::fidl::internal::FrameworkErr>::ToWire(arena, std::move(src.framework_err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayTableErrResult, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayTableErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayTableErrResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayTableErrResponse, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayTableErrResult::Tag::kErr:
      return ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.err())));
    case ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayTableErrResult::Tag::kFrameworkErr:
      return ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResult::WithFrameworkErr(
        WireNaturalConversionTraits<::fidl::internal::FrameworkErr, ::fidl::internal::FrameworkErr>::ToNatural(std::move(src.framework_err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayTableErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayTableErrResult, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayTableErrResult::WithResponse(arena,
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayTableErrResponse, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResult::Tag::kErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayTableErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.err().value())));
    case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResult::Tag::kFrameworkErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleTwoWayTableErrResult::WithFrameworkErr(
        WireNaturalConversionTraits<::fidl::internal::FrameworkErr, ::fidl::internal::FrameworkErr>::ToWire(arena, std::move(src.framework_err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsProtocolStrictEventUnionRequest WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictEventUnionRequest, ::test_unknowninteractions::UnknownInteractionsProtocolStrictEventUnionRequest>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictEventUnionRequest src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictEventUnionRequest::Tag::kSomeField:
      return ::test_unknowninteractions::UnknownInteractionsProtocolStrictEventUnionRequest::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field())));
    default:
      return ::test_unknowninteractions::UnknownInteractionsProtocolStrictEventUnionRequest(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
  }
}
::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictEventUnionRequest WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictEventUnionRequest, ::test_unknowninteractions::UnknownInteractionsProtocolStrictEventUnionRequest>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsProtocolStrictEventUnionRequest src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsProtocolStrictEventUnionRequest::Tag::kSomeField:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictEventUnionRequest::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
    default:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictEventUnionRequest();
  }
}






::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventUnionRequest WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleEventUnionRequest, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventUnionRequest>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleEventUnionRequest src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleEventUnionRequest::Tag::kSomeField:
      return ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventUnionRequest::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field())));
    default:
      return ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventUnionRequest(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
  }
}
::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleEventUnionRequest WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleEventUnionRequest, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventUnionRequest>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventUnionRequest src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventUnionRequest::Tag::kSomeField:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleEventUnionRequest::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
    default:
      return ::test_unknowninteractions::wire::UnknownInteractionsProtocolFlexibleEventUnionRequest();
  }
}






::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayUnionResponse, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayUnionResponse src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayUnionResponse::Tag::kSomeField:
      return ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionResponse::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field())));
    default:
      return ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionResponse(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
  }
}
::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayUnionResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayUnionResponse, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionResponse src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionResponse::Tag::kSomeField:
      return ::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayUnionResponse::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
    default:
      return ::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayUnionResponse();
  }
}






::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayErrResult, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayErrResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayErrResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayErrResponse, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayErrResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayErrResult::Tag::kErr:
      return ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayErrResult, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayErrResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayErrResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayErrResponse, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayErrResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayErrResult::Tag::kErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResult, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResponse, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResult::Tag::kErr:
      return ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResult, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResponse, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResult::Tag::kErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResponse, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResponse src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResponse::Tag::kSomeField:
      return ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResponse::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field())));
    default:
      return ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResponse(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
  }
}
::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResponse, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResponse src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResponse::Tag::kSomeField:
      return ::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResponse::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
    default:
      return ::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResponse();
  }
}






::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResult, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResponse, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResult::Tag::kErr:
      return ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResult, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResult::WithResponse(arena,
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResponse, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResult::Tag::kErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResult, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResponse, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResult::Tag::kErr:
      return ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResult, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResult::WithResponse(arena,
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResponse, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResult::Tag::kErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventUnionRequest WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictEventUnionRequest, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventUnionRequest>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictEventUnionRequest src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictEventUnionRequest::Tag::kSomeField:
      return ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventUnionRequest::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field())));
    default:
      return ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventUnionRequest(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
  }
}
::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictEventUnionRequest WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictEventUnionRequest, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventUnionRequest>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventUnionRequest src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventUnionRequest::Tag::kSomeField:
      return ::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictEventUnionRequest::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
    default:
      return ::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictEventUnionRequest();
  }
}






::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventUnionRequest WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolFlexibleEventUnionRequest, ::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventUnionRequest>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolFlexibleEventUnionRequest src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolFlexibleEventUnionRequest::Tag::kSomeField:
      return ::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventUnionRequest::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field())));
    default:
      return ::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventUnionRequest(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
  }
}
::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolFlexibleEventUnionRequest WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolFlexibleEventUnionRequest, ::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventUnionRequest>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventUnionRequest src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventUnionRequest::Tag::kSomeField:
      return ::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolFlexibleEventUnionRequest::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
    default:
      return ::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolFlexibleEventUnionRequest();
  }
}






::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayUnionResponse, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayUnionResponse src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayUnionResponse::Tag::kSomeField:
      return ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionResponse::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field())));
    default:
      return ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionResponse(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
  }
}
::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayUnionResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayUnionResponse, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionResponse src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionResponse::Tag::kSomeField:
      return ::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayUnionResponse::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
    default:
      return ::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayUnionResponse();
  }
}






::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayErrResult, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayErrResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayErrResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayErrResponse, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayErrResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayErrResult::Tag::kErr:
      return ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayErrResult, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayErrResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayErrResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayErrResponse, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayErrResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayErrResult::Tag::kErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResult, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResponse, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResult::Tag::kErr:
      return ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResult, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResponse, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResult::Tag::kErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResponse, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResponse src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResponse::Tag::kSomeField:
      return ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResponse::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field())));
    default:
      return ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResponse(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
  }
}
::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResponse, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResponse src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResponse::Tag::kSomeField:
      return ::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResponse::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
    default:
      return ::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResponse();
  }
}






::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResult, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResponse, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResult::Tag::kErr:
      return ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResult, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResult::WithResponse(arena,
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResponse, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResult::Tag::kErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResult, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResponse, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResult::Tag::kErr:
      return ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResult, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResult::WithResponse(arena,
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResponse, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResult::Tag::kErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventUnionRequest WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictEventUnionRequest, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventUnionRequest>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictEventUnionRequest src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictEventUnionRequest::Tag::kSomeField:
      return ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventUnionRequest::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field())));
    default:
      return ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventUnionRequest(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
  }
}
::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictEventUnionRequest WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictEventUnionRequest, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventUnionRequest>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventUnionRequest src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventUnionRequest::Tag::kSomeField:
      return ::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictEventUnionRequest::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
    default:
      return ::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictEventUnionRequest();
  }
}






::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayUnionResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayUnionResponse src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayUnionResponse::Tag::kSomeField:
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionResponse::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field())));
    default:
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionResponse(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
  }
}
::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayUnionResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayUnionResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionResponse src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionResponse::Tag::kSomeField:
      return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayUnionResponse::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
    default:
      return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayUnionResponse();
  }
}






::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayErrResult, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayErrResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayErrResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayErrResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayErrResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayErrResult::Tag::kErr:
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayErrResult, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayErrResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayErrResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayErrResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayErrResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayErrResult::Tag::kErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResult, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResult::Tag::kErr:
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResult, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResult::Tag::kErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResponse src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResponse::Tag::kSomeField:
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResponse::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field())));
    default:
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResponse(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
  }
}
::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResponse src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResponse::Tag::kSomeField:
      return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResponse::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
    default:
      return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResponse();
  }
}






::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResult, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResult::Tag::kErr:
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResult, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResult::WithResponse(arena,
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResult::Tag::kErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResult, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResult::Tag::kErr:
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResult, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResult::WithResponse(arena,
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResult::Tag::kErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayResult, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayResult::Tag::kFrameworkErr:
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayResult::WithFrameworkErr(
        WireNaturalConversionTraits<::fidl::internal::FrameworkErr, ::fidl::internal::FrameworkErr>::ToNatural(std::move(src.framework_err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayResult, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayResult::Tag::kFrameworkErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayResult::WithFrameworkErr(
        WireNaturalConversionTraits<::fidl::internal::FrameworkErr, ::fidl::internal::FrameworkErr>::ToWire(arena, std::move(src.framework_err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResult, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResult::Tag::kFrameworkErr:
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResult::WithFrameworkErr(
        WireNaturalConversionTraits<::fidl::internal::FrameworkErr, ::fidl::internal::FrameworkErr>::ToNatural(std::move(src.framework_err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResult, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResult::Tag::kFrameworkErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResult::WithFrameworkErr(
        WireNaturalConversionTraits<::fidl::internal::FrameworkErr, ::fidl::internal::FrameworkErr>::ToWire(arena, std::move(src.framework_err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResponse src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResponse::Tag::kSomeField:
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResponse::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field())));
    default:
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResponse(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
  }
}
::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResponse src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResponse::Tag::kSomeField:
      return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResponse::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
    default:
      return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResponse();
  }
}






::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResult, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResult::Tag::kFrameworkErr:
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResult::WithFrameworkErr(
        WireNaturalConversionTraits<::fidl::internal::FrameworkErr, ::fidl::internal::FrameworkErr>::ToNatural(std::move(src.framework_err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResult, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResult::WithResponse(arena,
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResult::Tag::kFrameworkErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResult::WithFrameworkErr(
        WireNaturalConversionTraits<::fidl::internal::FrameworkErr, ::fidl::internal::FrameworkErr>::ToWire(arena, std::move(src.framework_err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResult, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResult::Tag::kFrameworkErr:
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResult::WithFrameworkErr(
        WireNaturalConversionTraits<::fidl::internal::FrameworkErr, ::fidl::internal::FrameworkErr>::ToNatural(std::move(src.framework_err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResult, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResult::WithResponse(arena,
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResult::Tag::kFrameworkErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResult::WithFrameworkErr(
        WireNaturalConversionTraits<::fidl::internal::FrameworkErr, ::fidl::internal::FrameworkErr>::ToWire(arena, std::move(src.framework_err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResult, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResult::Tag::kErr:
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.err())));
    case ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResult::Tag::kFrameworkErr:
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResult::WithFrameworkErr(
        WireNaturalConversionTraits<::fidl::internal::FrameworkErr, ::fidl::internal::FrameworkErr>::ToNatural(std::move(src.framework_err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResult, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResult::Tag::kErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.err().value())));
    case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResult::Tag::kFrameworkErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResult::WithFrameworkErr(
        WireNaturalConversionTraits<::fidl::internal::FrameworkErr, ::fidl::internal::FrameworkErr>::ToWire(arena, std::move(src.framework_err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResult, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResult::Tag::kErr:
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.err())));
    case ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResult::Tag::kFrameworkErr:
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResult::WithFrameworkErr(
        WireNaturalConversionTraits<::fidl::internal::FrameworkErr, ::fidl::internal::FrameworkErr>::ToNatural(std::move(src.framework_err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResult, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResult::Tag::kErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.err().value())));
    case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResult::Tag::kFrameworkErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResult::WithFrameworkErr(
        WireNaturalConversionTraits<::fidl::internal::FrameworkErr, ::fidl::internal::FrameworkErr>::ToWire(arena, std::move(src.framework_err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResponse src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResponse::Tag::kSomeField:
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResponse::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field())));
    default:
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResponse(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
  }
}
::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResponse src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResponse::Tag::kSomeField:
      return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResponse::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
    default:
      return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResponse();
  }
}






::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResult, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResult::Tag::kErr:
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.err())));
    case ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResult::Tag::kFrameworkErr:
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResult::WithFrameworkErr(
        WireNaturalConversionTraits<::fidl::internal::FrameworkErr, ::fidl::internal::FrameworkErr>::ToNatural(std::move(src.framework_err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResult, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResult::WithResponse(arena,
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResult::Tag::kErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.err().value())));
    case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResult::Tag::kFrameworkErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResult::WithFrameworkErr(
        WireNaturalConversionTraits<::fidl::internal::FrameworkErr, ::fidl::internal::FrameworkErr>::ToWire(arena, std::move(src.framework_err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResult, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResult::Tag::kErr:
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.err())));
    case ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResult::Tag::kFrameworkErr:
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResult::WithFrameworkErr(
        WireNaturalConversionTraits<::fidl::internal::FrameworkErr, ::fidl::internal::FrameworkErr>::ToNatural(std::move(src.framework_err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResult, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResult::WithResponse(arena,
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResponse, ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResult::Tag::kErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.err().value())));
    case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResult::Tag::kFrameworkErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResult::WithFrameworkErr(
        WireNaturalConversionTraits<::fidl::internal::FrameworkErr, ::fidl::internal::FrameworkErr>::ToWire(arena, std::move(src.framework_err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionResponse, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionResponse src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionResponse::Tag::kSomeField:
      return ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionResponse::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field())));
    default:
      return ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionResponse(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
  }
}
::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionResponse, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionResponse src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionResponse::Tag::kSomeField:
      return ::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionResponse::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
    default:
      return ::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionResponse();
  }
}






::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResult, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResponse, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResult::Tag::kErr:
      return ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResult, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResponse, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResult::Tag::kErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResult, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResponse, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResult::Tag::kErr:
      return ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResult, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResponse, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResult::Tag::kErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResponse, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResponse src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResponse::Tag::kSomeField:
      return ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResponse::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field())));
    default:
      return ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResponse(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
  }
}
::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResponse, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResponse src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResponse::Tag::kSomeField:
      return ::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResponse::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
    default:
      return ::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResponse();
  }
}






::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResult, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResponse, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResult::Tag::kErr:
      return ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResult, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResult::WithResponse(arena,
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResponse, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResult::Tag::kErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResult, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResponse, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResult::Tag::kErr:
      return ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResult, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResult::WithResponse(arena,
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResponse, ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResult::Tag::kErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionResponse, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionResponse src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionResponse::Tag::kSomeField:
      return ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionResponse::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field())));
    default:
      return ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionResponse(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
  }
}
::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionResponse, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionResponse src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionResponse::Tag::kSomeField:
      return ::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionResponse::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
    default:
      return ::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionResponse();
  }
}






::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResult, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResponse, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResult::Tag::kErr:
      return ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResult, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResponse, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResult::Tag::kErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResult, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResponse, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResult::Tag::kErr:
      return ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResult, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResponse, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResult::Tag::kErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResponse, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResponse>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResponse src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResponse::Tag::kSomeField:
      return ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResponse::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.some_field())));
    default:
      return ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResponse(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
  }
}
::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResponse WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResponse, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResponse>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResponse src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResponse::Tag::kSomeField:
      return ::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResponse::WithSomeField(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.some_field().value())));
    default:
      return ::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResponse();
  }
}






::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResult, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResponse, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResult::Tag::kErr:
      return ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResult, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResult::WithResponse(arena,
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResponse, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResult::Tag::kErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.err().value())));
  }
}






::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResult, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResult>::ToNatural(::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResult::Tag::kResponse:
      return ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResult::WithResponse(
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResponse, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResponse>::ToNatural(std::move(src.response())));
    case ::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResult::Tag::kErr:
      return ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.err())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResult WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResult, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResult>::ToWire(fidl::AnyArena& arena, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResult src) {
  switch (src.Which()) {
    case ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResult::Tag::kResponse:
      return ::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResult::WithResponse(arena,
        WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResponse, ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResponse>::ToWire(arena, std::move(src.response().value())));
    case ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResult::Tag::kErr:
      return ::test_unknowninteractions::wire::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResult::WithErr(
        WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.err().value())));
  }
}




#ifdef __Fuchsia__





















::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayFields>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayFields>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayFields>>::ToNatural(::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayFields> src) {
  return ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayFields>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayFieldsResponse, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsResponse>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayFields>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayFields>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayFields>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayFields> src) {
  return ::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayFields>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayFieldsResponse, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsResponse>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayUnion>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayUnion>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayUnion>>::ToNatural(::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayUnion> src) {
  return ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayUnion>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayUnionResponse, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionResponse>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayUnion>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayUnion>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayUnion>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayUnion> src) {
  return ::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayUnion>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayUnionResponse, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionResponse>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayTable>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayTable>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayTable>>::ToNatural(::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayTable> src) {
  return ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayTable>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayTableResponse, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableResponse>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayTable>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayTable>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayTable>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayTable> src) {
  return ::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayTable>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayTableResponse, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableResponse>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayErr>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayErr>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayErr>>::ToNatural(::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayErr> src) {
  return ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayErr>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayErrResult, ::fit::result<int32_t>>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayErr>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayErr>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayErr>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayErr> src) {
  return ::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayErr>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayErrResult, ::fit::result<int32_t>>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayFieldsErr>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayFieldsErr>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayFieldsErr>>::ToNatural(::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayFieldsErr> src) {
  return ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayFieldsErr>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayFieldsErrResult, ::fit::result<int32_t, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResponse>>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayFieldsErr>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayFieldsErr>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayFieldsErr>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayFieldsErr> src) {
  return ::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayFieldsErr>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayFieldsErrResult, ::fit::result<int32_t, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResponse>>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayUnionErr>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayUnionErr>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayUnionErr>>::ToNatural(::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayUnionErr> src) {
  return ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayUnionErr>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayUnionErrResult, ::fit::result<int32_t, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResponse>>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayUnionErr>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayUnionErr>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayUnionErr>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayUnionErr> src) {
  return ::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayUnionErr>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayUnionErrResult, ::fit::result<int32_t, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResponse>>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayTableErr>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayTableErr>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayTableErr>>::ToNatural(::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayTableErr> src) {
  return ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayTableErr>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayTableErrResult, ::fit::result<int32_t, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResponse>>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayTableErr>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayTableErr>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayTableErr>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayTableErr> src) {
  return ::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsProtocol::StrictTwoWayTableErr>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsProtocolStrictTwoWayTableErrResult, ::fit::result<int32_t, ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResponse>>::ToWire(arena, std::move(src)));
}




























::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayFields>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayFields>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayFields>>::ToNatural(::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayFields> src) {
  return ::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayFields>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayFieldsResponse, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsResponse>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayFields>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayFields>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayFields>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayFields> src) {
  return ::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayFields>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayFieldsResponse, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsResponse>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayUnion>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayUnion>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayUnion>>::ToNatural(::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayUnion> src) {
  return ::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayUnion>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayUnionResponse, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionResponse>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayUnion>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayUnion>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayUnion>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayUnion> src) {
  return ::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayUnion>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayUnionResponse, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionResponse>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayTable>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayTable>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayTable>>::ToNatural(::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayTable> src) {
  return ::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayTable>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayTableResponse, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableResponse>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayTable>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayTable>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayTable>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayTable> src) {
  return ::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayTable>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayTableResponse, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableResponse>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayErr>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayErr>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayErr>>::ToNatural(::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayErr> src) {
  return ::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayErr>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayErrResult, ::fit::result<int32_t>>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayErr>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayErr>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayErr>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayErr> src) {
  return ::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayErr>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayErrResult, ::fit::result<int32_t>>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayFieldsErr>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayFieldsErr>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayFieldsErr>>::ToNatural(::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayFieldsErr> src) {
  return ::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayFieldsErr>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResult, ::fit::result<int32_t, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResponse>>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayFieldsErr>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayFieldsErr>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayFieldsErr>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayFieldsErr> src) {
  return ::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayFieldsErr>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResult, ::fit::result<int32_t, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResponse>>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayUnionErr>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayUnionErr>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayUnionErr>>::ToNatural(::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayUnionErr> src) {
  return ::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayUnionErr>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResult, ::fit::result<int32_t, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResponse>>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayUnionErr>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayUnionErr>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayUnionErr>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayUnionErr> src) {
  return ::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayUnionErr>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResult, ::fit::result<int32_t, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResponse>>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayTableErr>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayTableErr>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayTableErr>>::ToNatural(::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayTableErr> src) {
  return ::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayTableErr>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResult, ::fit::result<int32_t, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResponse>>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayTableErr>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayTableErr>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayTableErr>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayTableErr> src) {
  return ::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsAjarProtocol::StrictTwoWayTableErr>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResult, ::fit::result<int32_t, ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResponse>>::ToWire(arena, std::move(src)));
}



















::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayFields>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayFields>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayFields>>::ToNatural(::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayFields> src) {
  return ::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayFields>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayFieldsResponse, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsResponse>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayFields>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayFields>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayFields>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayFields> src) {
  return ::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayFields>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayFieldsResponse, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsResponse>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayUnion>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayUnion>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayUnion>>::ToNatural(::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayUnion> src) {
  return ::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayUnion>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayUnionResponse, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionResponse>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayUnion>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayUnion>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayUnion>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayUnion> src) {
  return ::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayUnion>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayUnionResponse, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionResponse>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayTable>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayTable>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayTable>>::ToNatural(::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayTable> src) {
  return ::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayTable>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayTableResponse, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableResponse>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayTable>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayTable>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayTable>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayTable> src) {
  return ::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayTable>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayTableResponse, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableResponse>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayErr>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayErr>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayErr>>::ToNatural(::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayErr> src) {
  return ::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayErr>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayErrResult, ::fit::result<int32_t>>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayErr>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayErr>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayErr>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayErr> src) {
  return ::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayErr>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayErrResult, ::fit::result<int32_t>>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayFieldsErr>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayFieldsErr>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayFieldsErr>>::ToNatural(::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayFieldsErr> src) {
  return ::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayFieldsErr>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResult, ::fit::result<int32_t, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResponse>>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayFieldsErr>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayFieldsErr>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayFieldsErr>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayFieldsErr> src) {
  return ::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayFieldsErr>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResult, ::fit::result<int32_t, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResponse>>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayUnionErr>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayUnionErr>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayUnionErr>>::ToNatural(::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayUnionErr> src) {
  return ::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayUnionErr>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResult, ::fit::result<int32_t, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResponse>>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayUnionErr>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayUnionErr>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayUnionErr>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayUnionErr> src) {
  return ::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayUnionErr>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResult, ::fit::result<int32_t, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResponse>>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayTableErr>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayTableErr>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayTableErr>>::ToNatural(::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayTableErr> src) {
  return ::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayTableErr>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResult, ::fit::result<int32_t, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResponse>>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayTableErr>  WireNaturalConversionTraits<::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayTableErr>, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayTableErr>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayTableErr> src) {
  return ::fidl::WireResponse<::test_unknowninteractions::UnknownInteractionsClosedProtocol::StrictTwoWayTableErr>(
    WireNaturalConversionTraits<::test_unknowninteractions::wire::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResult, ::fit::result<int32_t, ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResponse>>::ToWire(arena, std::move(src)));
}





#endif  // __Fuchsia__
#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl

