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

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

namespace fidl {
namespace internal {

::test_bindingsdenylist::MemberOnlyAppearsInImportingLibrary
WireNaturalConversionTraits<
    ::test_bindingsdenylist::wire::MemberOnlyAppearsInImportingLibrary,
    ::test_bindingsdenylist::MemberOnlyAppearsInImportingLibrary>::
    ToNatural(::test_bindingsdenylist::wire::MemberOnlyAppearsInImportingLibrary
                  src) {
  return ::test_bindingsdenylist::MemberOnlyAppearsInImportingLibrary(
      WireNaturalConversionTraits<bool, bool>::ToNatural(std::move(src.a)));
}
::test_bindingsdenylist::wire::MemberOnlyAppearsInImportingLibrary
WireNaturalConversionTraits<
    ::test_bindingsdenylist::wire::MemberOnlyAppearsInImportingLibrary,
    ::test_bindingsdenylist::MemberOnlyAppearsInImportingLibrary>::
    ToWire(fidl::AnyArena& arena,
           ::test_bindingsdenylist::MemberOnlyAppearsInImportingLibrary src) {
  return ::test_bindingsdenylist::wire::MemberOnlyAppearsInImportingLibrary{
      .a = WireNaturalConversionTraits<bool, bool>::ToWire(arena,
                                                           std::move(src.a())),
  };
}

::test_bindingsdenylist::OnlyAppearsInImportingLibrary
WireNaturalConversionTraits<
    ::test_bindingsdenylist::wire::OnlyAppearsInImportingLibrary,
    ::test_bindingsdenylist::OnlyAppearsInImportingLibrary>::
    ToNatural(
        ::test_bindingsdenylist::wire::OnlyAppearsInImportingLibrary src) {
  return ::test_bindingsdenylist::OnlyAppearsInImportingLibrary(
      WireNaturalConversionTraits<
          ::test_bindingsdenylist::wire::MemberOnlyAppearsInImportingLibrary,
          ::test_bindingsdenylist::MemberOnlyAppearsInImportingLibrary>::
          ToNatural(std::move(src.member_only_appears_in_importing_library)));
}
::test_bindingsdenylist::wire::OnlyAppearsInImportingLibrary
WireNaturalConversionTraits<
    ::test_bindingsdenylist::wire::OnlyAppearsInImportingLibrary,
    ::test_bindingsdenylist::OnlyAppearsInImportingLibrary>::
    ToWire(fidl::AnyArena& arena,
           ::test_bindingsdenylist::OnlyAppearsInImportingLibrary src) {
  return ::test_bindingsdenylist::wire::OnlyAppearsInImportingLibrary{
      .member_only_appears_in_importing_library = WireNaturalConversionTraits<
          ::test_bindingsdenylist::wire::MemberOnlyAppearsInImportingLibrary,
          ::test_bindingsdenylist::MemberOnlyAppearsInImportingLibrary>::
          ToWire(arena,
                 std::move(src.member_only_appears_in_importing_library())),
  };
}

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

::test_bindingsdenylist::DenyEachBindingOnlyDenySyzkallerTopResponse
WireNaturalConversionTraits<
    ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenySyzkallerTopResponse,
    ::test_bindingsdenylist::DenyEachBindingOnlyDenySyzkallerTopResponse>::
    ToNatural(::test_bindingsdenylist::wire::
                  DenyEachBindingOnlyDenySyzkallerTopResponse src) {
  return ::test_bindingsdenylist::DenyEachBindingOnlyDenySyzkallerTopResponse(
      WireNaturalConversionTraits<
          ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenySyzkallerResult,
          ::test_bindingsdenylist::DenyEachBindingOnlyDenySyzkallerResult>::
          ToNatural(std::move(src.result)));
}
::test_bindingsdenylist::wire::DenyEachBindingOnlyDenySyzkallerTopResponse
WireNaturalConversionTraits<
    ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenySyzkallerTopResponse,
    ::test_bindingsdenylist::DenyEachBindingOnlyDenySyzkallerTopResponse>::
    ToWire(fidl::AnyArena& arena,
           ::test_bindingsdenylist::DenyEachBindingOnlyDenySyzkallerTopResponse
               src) {
  return ::test_bindingsdenylist::wire::
      DenyEachBindingOnlyDenySyzkallerTopResponse{
          .result = WireNaturalConversionTraits<
              ::test_bindingsdenylist::wire::
                  DenyEachBindingOnlyDenySyzkallerResult,
              ::test_bindingsdenylist::DenyEachBindingOnlyDenySyzkallerResult>::
              ToWire(arena, std::move(src.result())),
      };
}

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

::test_bindingsdenylist::DenyEachBindingOnlyDenyRustTopResponse
WireNaturalConversionTraits<
    ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustTopResponse,
    ::test_bindingsdenylist::DenyEachBindingOnlyDenyRustTopResponse>::
    ToNatural(
        ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustTopResponse
            src) {
  return ::test_bindingsdenylist::DenyEachBindingOnlyDenyRustTopResponse(
      WireNaturalConversionTraits<
          ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustResult,
          ::test_bindingsdenylist::DenyEachBindingOnlyDenyRustResult>::
          ToNatural(std::move(src.result)));
}
::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustTopResponse
WireNaturalConversionTraits<
    ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustTopResponse,
    ::test_bindingsdenylist::DenyEachBindingOnlyDenyRustTopResponse>::
    ToWire(
        fidl::AnyArena& arena,
        ::test_bindingsdenylist::DenyEachBindingOnlyDenyRustTopResponse src) {
  return ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustTopResponse{
      .result = WireNaturalConversionTraits<
          ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustResult,
          ::test_bindingsdenylist::DenyEachBindingOnlyDenyRustResult>::
          ToWire(arena, std::move(src.result())),
  };
}

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

::test_bindingsdenylist::DenyEachBindingOnlyDenyLibfuzzerTopResponse
WireNaturalConversionTraits<
    ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyLibfuzzerTopResponse,
    ::test_bindingsdenylist::DenyEachBindingOnlyDenyLibfuzzerTopResponse>::
    ToNatural(::test_bindingsdenylist::wire::
                  DenyEachBindingOnlyDenyLibfuzzerTopResponse src) {
  return ::test_bindingsdenylist::DenyEachBindingOnlyDenyLibfuzzerTopResponse(
      WireNaturalConversionTraits<
          ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyLibfuzzerResult,
          ::test_bindingsdenylist::DenyEachBindingOnlyDenyLibfuzzerResult>::
          ToNatural(std::move(src.result)));
}
::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyLibfuzzerTopResponse
WireNaturalConversionTraits<
    ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyLibfuzzerTopResponse,
    ::test_bindingsdenylist::DenyEachBindingOnlyDenyLibfuzzerTopResponse>::
    ToWire(fidl::AnyArena& arena,
           ::test_bindingsdenylist::DenyEachBindingOnlyDenyLibfuzzerTopResponse
               src) {
  return ::test_bindingsdenylist::wire::
      DenyEachBindingOnlyDenyLibfuzzerTopResponse{
          .result = WireNaturalConversionTraits<
              ::test_bindingsdenylist::wire::
                  DenyEachBindingOnlyDenyLibfuzzerResult,
              ::test_bindingsdenylist::DenyEachBindingOnlyDenyLibfuzzerResult>::
              ToWire(arena, std::move(src.result())),
      };
}

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

::test_bindingsdenylist::DenyEachBindingOnlyDenyGoTopResponse
WireNaturalConversionTraits<
    ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoTopResponse,
    ::test_bindingsdenylist::DenyEachBindingOnlyDenyGoTopResponse>::
    ToNatural(
        ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoTopResponse
            src) {
  return ::test_bindingsdenylist::DenyEachBindingOnlyDenyGoTopResponse(
      WireNaturalConversionTraits<
          ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoResult,
          ::test_bindingsdenylist::DenyEachBindingOnlyDenyGoResult>::
          ToNatural(std::move(src.result)));
}
::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoTopResponse
WireNaturalConversionTraits<
    ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoTopResponse,
    ::test_bindingsdenylist::DenyEachBindingOnlyDenyGoTopResponse>::
    ToWire(fidl::AnyArena& arena,
           ::test_bindingsdenylist::DenyEachBindingOnlyDenyGoTopResponse src) {
  return ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoTopResponse{
      .result = WireNaturalConversionTraits<
          ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoResult,
          ::test_bindingsdenylist::DenyEachBindingOnlyDenyGoResult>::
          ToWire(arena, std::move(src.result())),
  };
}

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

::test_bindingsdenylist::DenyEachBindingOnlyDenyDartTopResponse
WireNaturalConversionTraits<
    ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartTopResponse,
    ::test_bindingsdenylist::DenyEachBindingOnlyDenyDartTopResponse>::
    ToNatural(
        ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartTopResponse
            src) {
  return ::test_bindingsdenylist::DenyEachBindingOnlyDenyDartTopResponse(
      WireNaturalConversionTraits<
          ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartResult,
          ::test_bindingsdenylist::DenyEachBindingOnlyDenyDartResult>::
          ToNatural(std::move(src.result)));
}
::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartTopResponse
WireNaturalConversionTraits<
    ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartTopResponse,
    ::test_bindingsdenylist::DenyEachBindingOnlyDenyDartTopResponse>::
    ToWire(
        fidl::AnyArena& arena,
        ::test_bindingsdenylist::DenyEachBindingOnlyDenyDartTopResponse src) {
  return ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartTopResponse{
      .result = WireNaturalConversionTraits<
          ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartResult,
          ::test_bindingsdenylist::DenyEachBindingOnlyDenyDartResult>::
          ToWire(arena, std::move(src.result())),
  };
}

::test_bindingsdenylist::DenyEachBindingOnlyDenySyzkallerRequest
WireNaturalConversionTraits<
    ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenySyzkallerRequest,
    ::test_bindingsdenylist::DenyEachBindingOnlyDenySyzkallerRequest>::
    ToNatural(
        ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenySyzkallerRequest
            src) {
  return ::test_bindingsdenylist::DenyEachBindingOnlyDenySyzkallerRequest(
      WireNaturalConversionTraits<bool, bool>::ToNatural(std::move(src.a)));
}
::test_bindingsdenylist::wire::DenyEachBindingOnlyDenySyzkallerRequest
WireNaturalConversionTraits<
    ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenySyzkallerRequest,
    ::test_bindingsdenylist::DenyEachBindingOnlyDenySyzkallerRequest>::
    ToWire(
        fidl::AnyArena& arena,
        ::test_bindingsdenylist::DenyEachBindingOnlyDenySyzkallerRequest src) {
  return ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenySyzkallerRequest{
      .a = WireNaturalConversionTraits<bool, bool>::ToWire(arena,
                                                           std::move(src.a())),
  };
}

::test_bindingsdenylist::DenyEachBindingOnlyDenyRustRequest
WireNaturalConversionTraits<
    ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustRequest,
    ::test_bindingsdenylist::DenyEachBindingOnlyDenyRustRequest>::
    ToNatural(
        ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustRequest src) {
  return ::test_bindingsdenylist::DenyEachBindingOnlyDenyRustRequest(
      WireNaturalConversionTraits<bool, bool>::ToNatural(std::move(src.a)));
}
::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustRequest
WireNaturalConversionTraits<
    ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustRequest,
    ::test_bindingsdenylist::DenyEachBindingOnlyDenyRustRequest>::
    ToWire(fidl::AnyArena& arena,
           ::test_bindingsdenylist::DenyEachBindingOnlyDenyRustRequest src) {
  return ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustRequest{
      .a = WireNaturalConversionTraits<bool, bool>::ToWire(arena,
                                                           std::move(src.a())),
  };
}

::test_bindingsdenylist::DenyEachBindingOnlyDenyLibfuzzerRequest
WireNaturalConversionTraits<
    ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyLibfuzzerRequest,
    ::test_bindingsdenylist::DenyEachBindingOnlyDenyLibfuzzerRequest>::
    ToNatural(
        ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyLibfuzzerRequest
            src) {
  return ::test_bindingsdenylist::DenyEachBindingOnlyDenyLibfuzzerRequest(
      WireNaturalConversionTraits<bool, bool>::ToNatural(std::move(src.a)));
}
::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyLibfuzzerRequest
WireNaturalConversionTraits<
    ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyLibfuzzerRequest,
    ::test_bindingsdenylist::DenyEachBindingOnlyDenyLibfuzzerRequest>::
    ToWire(
        fidl::AnyArena& arena,
        ::test_bindingsdenylist::DenyEachBindingOnlyDenyLibfuzzerRequest src) {
  return ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyLibfuzzerRequest{
      .a = WireNaturalConversionTraits<bool, bool>::ToWire(arena,
                                                           std::move(src.a())),
  };
}

::test_bindingsdenylist::DenyEachBindingOnlyDenyGoRequest
WireNaturalConversionTraits<
    ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoRequest,
    ::test_bindingsdenylist::DenyEachBindingOnlyDenyGoRequest>::
    ToNatural(
        ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoRequest src) {
  return ::test_bindingsdenylist::DenyEachBindingOnlyDenyGoRequest(
      WireNaturalConversionTraits<bool, bool>::ToNatural(std::move(src.a)));
}
::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoRequest
WireNaturalConversionTraits<
    ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoRequest,
    ::test_bindingsdenylist::DenyEachBindingOnlyDenyGoRequest>::
    ToWire(fidl::AnyArena& arena,
           ::test_bindingsdenylist::DenyEachBindingOnlyDenyGoRequest src) {
  return ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoRequest{
      .a = WireNaturalConversionTraits<bool, bool>::ToWire(arena,
                                                           std::move(src.a())),
  };
}

::test_bindingsdenylist::DenyEachBindingOnlyDenyDartRequest
WireNaturalConversionTraits<
    ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartRequest,
    ::test_bindingsdenylist::DenyEachBindingOnlyDenyDartRequest>::
    ToNatural(
        ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartRequest src) {
  return ::test_bindingsdenylist::DenyEachBindingOnlyDenyDartRequest(
      WireNaturalConversionTraits<bool, bool>::ToNatural(std::move(src.a)));
}
::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartRequest
WireNaturalConversionTraits<
    ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartRequest,
    ::test_bindingsdenylist::DenyEachBindingOnlyDenyDartRequest>::
    ToWire(fidl::AnyArena& arena,
           ::test_bindingsdenylist::DenyEachBindingOnlyDenyDartRequest src) {
  return ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartRequest{
      .a = WireNaturalConversionTraits<bool, bool>::ToWire(arena,
                                                           std::move(src.a())),
  };
}

::test_bindingsdenylist::OnlyLlcpp
WireNaturalConversionTraits<::test_bindingsdenylist::wire::OnlyLlcpp,
                            ::test_bindingsdenylist::OnlyLlcpp>::
    ToNatural(::test_bindingsdenylist::wire::OnlyLlcpp src) {
  switch (src.Which()) {
    case ::test_bindingsdenylist::wire::OnlyLlcpp::Tag::kX:
      return ::test_bindingsdenylist::OnlyLlcpp::WithX(
          WireNaturalConversionTraits<uint32_t, uint32_t>::ToNatural(
              std::move(src.x())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_bindingsdenylist::wire::OnlyLlcpp
WireNaturalConversionTraits<::test_bindingsdenylist::wire::OnlyLlcpp,
                            ::test_bindingsdenylist::OnlyLlcpp>::
    ToWire(fidl::AnyArena& arena, ::test_bindingsdenylist::OnlyLlcpp src) {
  switch (src.Which()) {
    case ::test_bindingsdenylist::OnlyLlcpp::Tag::kX:
      return ::test_bindingsdenylist::wire::OnlyLlcpp::WithX(
          WireNaturalConversionTraits<uint32_t, uint32_t>::ToWire(
              arena, std::move(src.x().value())));
  }
}

std::unique_ptr<::test_bindingsdenylist::OnlyLlcpp> WireNaturalConversionTraits<
    ::test_bindingsdenylist::wire::OnlyLlcpp,
    std::unique_ptr<::test_bindingsdenylist::OnlyLlcpp>>::
    ToNatural(::test_bindingsdenylist::wire::OnlyLlcpp src) {
  if (src.has_invalid_tag()) {
    return nullptr;
  }
  return std::make_unique<::test_bindingsdenylist::OnlyLlcpp>(
      WireNaturalConversionTraits<
          ::test_bindingsdenylist::wire::OnlyLlcpp,
          ::test_bindingsdenylist::OnlyLlcpp>::ToNatural(std::move(src)));
}
::test_bindingsdenylist::wire::OnlyLlcpp WireNaturalConversionTraits<
    ::test_bindingsdenylist::wire::OnlyLlcpp,
    std::unique_ptr<::test_bindingsdenylist::OnlyLlcpp>>::
    ToWire(fidl::AnyArena& arena,
           std::unique_ptr<::test_bindingsdenylist::OnlyLlcpp> src) {
  if (!src) {
    return ::test_bindingsdenylist::wire::OnlyLlcpp();
  }
  return WireNaturalConversionTraits<
      ::test_bindingsdenylist::wire::OnlyLlcpp,
      ::test_bindingsdenylist::OnlyLlcpp>::ToWire(arena, std::move(*src));
}

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

std::unique_ptr<::test_bindingsdenylist::DenyEachBindingOnlyDenySyzkallerResult>
WireNaturalConversionTraits<
    ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenySyzkallerResult,
    std::unique_ptr<
        ::test_bindingsdenylist::DenyEachBindingOnlyDenySyzkallerResult>>::
    ToNatural(
        ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenySyzkallerResult
            src) {
  if (src.has_invalid_tag()) {
    return nullptr;
  }
  return std::make_unique<
      ::test_bindingsdenylist::DenyEachBindingOnlyDenySyzkallerResult>(
      WireNaturalConversionTraits<
          ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenySyzkallerResult,
          ::test_bindingsdenylist::DenyEachBindingOnlyDenySyzkallerResult>::
          ToNatural(std::move(src)));
}
::test_bindingsdenylist::wire::DenyEachBindingOnlyDenySyzkallerResult
WireNaturalConversionTraits<
    ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenySyzkallerResult,
    std::unique_ptr<
        ::test_bindingsdenylist::DenyEachBindingOnlyDenySyzkallerResult>>::
    ToWire(fidl::AnyArena& arena,
           std::unique_ptr<
               ::test_bindingsdenylist::DenyEachBindingOnlyDenySyzkallerResult>
               src) {
  if (!src) {
    return ::test_bindingsdenylist::wire::
        DenyEachBindingOnlyDenySyzkallerResult();
  }
  return WireNaturalConversionTraits<
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenySyzkallerResult,
      ::test_bindingsdenylist::DenyEachBindingOnlyDenySyzkallerResult>::
      ToWire(arena, std::move(*src));
}

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

std::unique_ptr<::test_bindingsdenylist::DenyEachBindingOnlyDenyRustResult>
WireNaturalConversionTraits<
    ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustResult,
    std::unique_ptr<
        ::test_bindingsdenylist::DenyEachBindingOnlyDenyRustResult>>::
    ToNatural(
        ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustResult src) {
  if (src.has_invalid_tag()) {
    return nullptr;
  }
  return std::make_unique<
      ::test_bindingsdenylist::DenyEachBindingOnlyDenyRustResult>(
      WireNaturalConversionTraits<
          ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustResult,
          ::test_bindingsdenylist::DenyEachBindingOnlyDenyRustResult>::
          ToNatural(std::move(src)));
}
::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustResult
WireNaturalConversionTraits<
    ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustResult,
    std::unique_ptr<
        ::test_bindingsdenylist::DenyEachBindingOnlyDenyRustResult>>::
    ToWire(fidl::AnyArena& arena,
           std::unique_ptr<
               ::test_bindingsdenylist::DenyEachBindingOnlyDenyRustResult>
               src) {
  if (!src) {
    return ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustResult();
  }
  return WireNaturalConversionTraits<
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustResult,
      ::test_bindingsdenylist::DenyEachBindingOnlyDenyRustResult>::
      ToWire(arena, std::move(*src));
}

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

std::unique_ptr<::test_bindingsdenylist::DenyEachBindingOnlyDenyLibfuzzerResult>
WireNaturalConversionTraits<
    ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyLibfuzzerResult,
    std::unique_ptr<
        ::test_bindingsdenylist::DenyEachBindingOnlyDenyLibfuzzerResult>>::
    ToNatural(
        ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyLibfuzzerResult
            src) {
  if (src.has_invalid_tag()) {
    return nullptr;
  }
  return std::make_unique<
      ::test_bindingsdenylist::DenyEachBindingOnlyDenyLibfuzzerResult>(
      WireNaturalConversionTraits<
          ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyLibfuzzerResult,
          ::test_bindingsdenylist::DenyEachBindingOnlyDenyLibfuzzerResult>::
          ToNatural(std::move(src)));
}
::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyLibfuzzerResult
WireNaturalConversionTraits<
    ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyLibfuzzerResult,
    std::unique_ptr<
        ::test_bindingsdenylist::DenyEachBindingOnlyDenyLibfuzzerResult>>::
    ToWire(fidl::AnyArena& arena,
           std::unique_ptr<
               ::test_bindingsdenylist::DenyEachBindingOnlyDenyLibfuzzerResult>
               src) {
  if (!src) {
    return ::test_bindingsdenylist::wire::
        DenyEachBindingOnlyDenyLibfuzzerResult();
  }
  return WireNaturalConversionTraits<
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyLibfuzzerResult,
      ::test_bindingsdenylist::DenyEachBindingOnlyDenyLibfuzzerResult>::
      ToWire(arena, std::move(*src));
}

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

std::unique_ptr<::test_bindingsdenylist::DenyEachBindingOnlyDenyGoResult>
WireNaturalConversionTraits<
    ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoResult,
    std::unique_ptr<::test_bindingsdenylist::DenyEachBindingOnlyDenyGoResult>>::
    ToNatural(
        ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoResult src) {
  if (src.has_invalid_tag()) {
    return nullptr;
  }
  return std::make_unique<
      ::test_bindingsdenylist::DenyEachBindingOnlyDenyGoResult>(
      WireNaturalConversionTraits<
          ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoResult,
          ::test_bindingsdenylist::DenyEachBindingOnlyDenyGoResult>::
          ToNatural(std::move(src)));
}
::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoResult
WireNaturalConversionTraits<
    ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoResult,
    std::unique_ptr<::test_bindingsdenylist::DenyEachBindingOnlyDenyGoResult>>::
    ToWire(fidl::AnyArena& arena,
           std::unique_ptr<
               ::test_bindingsdenylist::DenyEachBindingOnlyDenyGoResult>
               src) {
  if (!src) {
    return ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoResult();
  }
  return WireNaturalConversionTraits<
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoResult,
      ::test_bindingsdenylist::DenyEachBindingOnlyDenyGoResult>::
      ToWire(arena, std::move(*src));
}

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

std::unique_ptr<::test_bindingsdenylist::DenyEachBindingOnlyDenyDartResult>
WireNaturalConversionTraits<
    ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartResult,
    std::unique_ptr<
        ::test_bindingsdenylist::DenyEachBindingOnlyDenyDartResult>>::
    ToNatural(
        ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartResult src) {
  if (src.has_invalid_tag()) {
    return nullptr;
  }
  return std::make_unique<
      ::test_bindingsdenylist::DenyEachBindingOnlyDenyDartResult>(
      WireNaturalConversionTraits<
          ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartResult,
          ::test_bindingsdenylist::DenyEachBindingOnlyDenyDartResult>::
          ToNatural(std::move(src)));
}
::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartResult
WireNaturalConversionTraits<
    ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartResult,
    std::unique_ptr<
        ::test_bindingsdenylist::DenyEachBindingOnlyDenyDartResult>>::
    ToWire(fidl::AnyArena& arena,
           std::unique_ptr<
               ::test_bindingsdenylist::DenyEachBindingOnlyDenyDartResult>
               src) {
  if (!src) {
    return ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartResult();
  }
  return WireNaturalConversionTraits<
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartResult,
      ::test_bindingsdenylist::DenyEachBindingOnlyDenyDartResult>::
      ToWire(arena, std::move(*src));
}

#ifdef __Fuchsia__

::fidl::Request<::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                    LibfuzzerNeedsNonemptyProtocol>
WireNaturalConversionTraits<
    ::fidl::WireRequest<::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                            LibfuzzerNeedsNonemptyProtocol>,
    ::fidl::Request<::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                        LibfuzzerNeedsNonemptyProtocol>>::
    ToNatural(
        ::fidl::WireRequest<::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                                LibfuzzerNeedsNonemptyProtocol>
            src) {
  return ::fidl::Request<::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                             LibfuzzerNeedsNonemptyProtocol>();
}
::fidl::WireRequest<::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                        LibfuzzerNeedsNonemptyProtocol>
WireNaturalConversionTraits<
    ::fidl::WireRequest<::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                            LibfuzzerNeedsNonemptyProtocol>,
    ::fidl::Request<::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                        LibfuzzerNeedsNonemptyProtocol>>::
    ToWire(fidl::AnyArena& arena,
           ::fidl::Request<::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                               LibfuzzerNeedsNonemptyProtocol>
               src) {
  return ::fidl::WireRequest<::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                                 LibfuzzerNeedsNonemptyProtocol>();
}

::fidl::Response<::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                     LibfuzzerNeedsNonemptyProtocol>
WireNaturalConversionTraits<
    ::fidl::WireResponse<::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                             LibfuzzerNeedsNonemptyProtocol>,
    ::fidl::Response<::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                         LibfuzzerNeedsNonemptyProtocol>>::
    ToNatural(
        ::fidl::WireResponse<::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                                 LibfuzzerNeedsNonemptyProtocol>
            src) {
  return ::fidl::Response<::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                              LibfuzzerNeedsNonemptyProtocol>();
}
::fidl::WireResponse<::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                         LibfuzzerNeedsNonemptyProtocol>
WireNaturalConversionTraits<
    ::fidl::WireResponse<::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                             LibfuzzerNeedsNonemptyProtocol>,
    ::fidl::Response<::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                         LibfuzzerNeedsNonemptyProtocol>>::
    ToWire(fidl::AnyArena& arena,
           ::fidl::Response<::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                                LibfuzzerNeedsNonemptyProtocol>
               src) {
  return ::fidl::WireResponse<::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                                  LibfuzzerNeedsNonemptyProtocol>();
}

::fidl::Request<::test_bindingsdenylist::ImportsSameNameContext::Unattributed>
WireNaturalConversionTraits<
    ::fidl::WireRequest<
        ::test_bindingsdenylist::ImportsSameNameContext::Unattributed>,
    ::fidl::Request<
        ::test_bindingsdenylist::ImportsSameNameContext::Unattributed>>::
    ToNatural(::fidl::WireRequest<
              ::test_bindingsdenylist::ImportsSameNameContext::Unattributed>
                  src) {
  return ::fidl::Request<
      ::test_bindingsdenylist::ImportsSameNameContext::Unattributed>();
}
::fidl::WireRequest<
    ::test_bindingsdenylist::ImportsSameNameContext::Unattributed>
WireNaturalConversionTraits<
    ::fidl::WireRequest<
        ::test_bindingsdenylist::ImportsSameNameContext::Unattributed>,
    ::fidl::Request<
        ::test_bindingsdenylist::ImportsSameNameContext::Unattributed>>::
    ToWire(fidl::AnyArena& arena,
           ::fidl::Request<
               ::test_bindingsdenylist::ImportsSameNameContext::Unattributed>
               src) {
  return ::fidl::WireRequest<
      ::test_bindingsdenylist::ImportsSameNameContext::Unattributed>();
}

::fidl::Request<::test_bindingsdenylist::ImportsSameNameContext::
                    AlwaysAppearsInImportingLibrary>
WireNaturalConversionTraits<
    ::fidl::WireRequest<::test_bindingsdenylist::ImportsSameNameContext::
                            AlwaysAppearsInImportingLibrary>,
    ::fidl::Request<::test_bindingsdenylist::ImportsSameNameContext::
                        AlwaysAppearsInImportingLibrary>>::
    ToNatural(
        ::fidl::WireRequest<::test_bindingsdenylist::ImportsSameNameContext::
                                AlwaysAppearsInImportingLibrary>
            src) {
  return ::fidl::Request<::test_bindingsdenylist::ImportsSameNameContext::
                             AlwaysAppearsInImportingLibrary>();
}
::fidl::WireRequest<::test_bindingsdenylist::ImportsSameNameContext::
                        AlwaysAppearsInImportingLibrary>
WireNaturalConversionTraits<
    ::fidl::WireRequest<::test_bindingsdenylist::ImportsSameNameContext::
                            AlwaysAppearsInImportingLibrary>,
    ::fidl::Request<::test_bindingsdenylist::ImportsSameNameContext::
                        AlwaysAppearsInImportingLibrary>>::
    ToWire(fidl::AnyArena& arena,
           ::fidl::Request<::test_bindingsdenylist::ImportsSameNameContext::
                               AlwaysAppearsInImportingLibrary>
               src) {
  return ::fidl::WireRequest<::test_bindingsdenylist::ImportsSameNameContext::
                                 AlwaysAppearsInImportingLibrary>();
}

::fidl::Request<::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>
WireNaturalConversionTraits<
    ::fidl::WireRequest<::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>,
    ::fidl::Request<::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>>::
    ToNatural(::fidl::WireRequest<
              ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>
                  src) {
  return ::fidl::Request<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>(
      WireNaturalConversionTraits<
          ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartRequest,
          ::test_bindingsdenylist::DenyEachBindingOnlyDenyDartRequest>::
          ToNatural(std::move(src)));
}
::fidl::WireRequest<::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>
WireNaturalConversionTraits<
    ::fidl::WireRequest<::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>,
    ::fidl::Request<::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>>::
    ToWire(
        fidl::AnyArena& arena,
        ::fidl::Request<::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>
            src) {
  return ::fidl::WireRequest<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>(
      WireNaturalConversionTraits<
          ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartRequest,
          ::test_bindingsdenylist::DenyEachBindingOnlyDenyDartRequest>::
          ToWire(arena, std::move(src)));
}

::fidl::Request<::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>
WireNaturalConversionTraits<
    ::fidl::WireRequest<::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>,
    ::fidl::Request<::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>>::
    ToNatural(::fidl::WireRequest<
              ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>
                  src) {
  return ::fidl::Request<::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>(
      WireNaturalConversionTraits<
          ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoRequest,
          ::test_bindingsdenylist::DenyEachBindingOnlyDenyGoRequest>::
          ToNatural(std::move(src)));
}
::fidl::WireRequest<::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>
WireNaturalConversionTraits<
    ::fidl::WireRequest<::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>,
    ::fidl::Request<::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>>::
    ToWire(fidl::AnyArena& arena,
           ::fidl::Request<::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>
               src) {
  return ::fidl::WireRequest<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>(
      WireNaturalConversionTraits<
          ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoRequest,
          ::test_bindingsdenylist::DenyEachBindingOnlyDenyGoRequest>::
          ToWire(arena, std::move(src)));
}

::fidl::Request<::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>
WireNaturalConversionTraits<
    ::fidl::WireRequest<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>,
    ::fidl::Request<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>>::
    ToNatural(::fidl::WireRequest<
              ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>
                  src) {
  return ::fidl::Request<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>(
      WireNaturalConversionTraits<
          ::test_bindingsdenylist::wire::
              DenyEachBindingOnlyDenyLibfuzzerRequest,
          ::test_bindingsdenylist::DenyEachBindingOnlyDenyLibfuzzerRequest>::
          ToNatural(std::move(src)));
}
::fidl::WireRequest<::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>
WireNaturalConversionTraits<
    ::fidl::WireRequest<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>,
    ::fidl::Request<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>>::
    ToWire(fidl::AnyArena& arena,
           ::fidl::Request<
               ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>
               src) {
  return ::fidl::WireRequest<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>(
      WireNaturalConversionTraits<
          ::test_bindingsdenylist::wire::
              DenyEachBindingOnlyDenyLibfuzzerRequest,
          ::test_bindingsdenylist::DenyEachBindingOnlyDenyLibfuzzerRequest>::
          ToWire(arena, std::move(src)));
}

::fidl::Request<::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>
WireNaturalConversionTraits<
    ::fidl::WireRequest<::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>,
    ::fidl::Request<::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>>::
    ToNatural(::fidl::WireRequest<
              ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>
                  src) {
  return ::fidl::Request<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>(
      WireNaturalConversionTraits<
          ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustRequest,
          ::test_bindingsdenylist::DenyEachBindingOnlyDenyRustRequest>::
          ToNatural(std::move(src)));
}
::fidl::WireRequest<::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>
WireNaturalConversionTraits<
    ::fidl::WireRequest<::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>,
    ::fidl::Request<::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>>::
    ToWire(
        fidl::AnyArena& arena,
        ::fidl::Request<::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>
            src) {
  return ::fidl::WireRequest<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>(
      WireNaturalConversionTraits<
          ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustRequest,
          ::test_bindingsdenylist::DenyEachBindingOnlyDenyRustRequest>::
          ToWire(arena, std::move(src)));
}

::fidl::Request<::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>
WireNaturalConversionTraits<
    ::fidl::WireRequest<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>,
    ::fidl::Request<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>>::
    ToNatural(::fidl::WireRequest<
              ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>
                  src) {
  return ::fidl::Request<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>(
      WireNaturalConversionTraits<
          ::test_bindingsdenylist::wire::
              DenyEachBindingOnlyDenySyzkallerRequest,
          ::test_bindingsdenylist::DenyEachBindingOnlyDenySyzkallerRequest>::
          ToNatural(std::move(src)));
}
::fidl::WireRequest<::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>
WireNaturalConversionTraits<
    ::fidl::WireRequest<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>,
    ::fidl::Request<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>>::
    ToWire(fidl::AnyArena& arena,
           ::fidl::Request<
               ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>
               src) {
  return ::fidl::WireRequest<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>(
      WireNaturalConversionTraits<
          ::test_bindingsdenylist::wire::
              DenyEachBindingOnlyDenySyzkallerRequest,
          ::test_bindingsdenylist::DenyEachBindingOnlyDenySyzkallerRequest>::
          ToWire(arena, std::move(src)));
}

::fidl::Response<::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>
WireNaturalConversionTraits<
    ::fidl::WireResponse<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>,
    ::fidl::Response<::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>>::
    ToNatural(::fidl::WireResponse<
              ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>
                  src) {
  return ::fidl::Response<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>(
      WireNaturalConversionTraits<
          ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartTopResponse,
          ::fitx::result<uint32_t, ::test_bindingsdenylist::
                                       DenyEachBindingOnlyDenyDartResponse>>::
          ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>
WireNaturalConversionTraits<
    ::fidl::WireResponse<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>,
    ::fidl::Response<::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>>::
    ToWire(
        fidl::AnyArena& arena,
        ::fidl::Response<::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>
            src) {
  return ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>(
      WireNaturalConversionTraits<
          ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartTopResponse,
          ::fitx::result<uint32_t, ::test_bindingsdenylist::
                                       DenyEachBindingOnlyDenyDartResponse>>::
          ToWire(arena, std::move(src)));
}

::fidl::Response<::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>
WireNaturalConversionTraits<
    ::fidl::WireResponse<::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>,
    ::fidl::Response<::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>>::
    ToNatural(::fidl::WireResponse<
              ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>
                  src) {
  return ::fidl::Response<::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>(
      WireNaturalConversionTraits<
          ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoTopResponse,
          ::fitx::result<uint32_t, ::test_bindingsdenylist::
                                       DenyEachBindingOnlyDenyGoResponse>>::
          ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>
WireNaturalConversionTraits<
    ::fidl::WireResponse<::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>,
    ::fidl::Response<::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>>::
    ToWire(
        fidl::AnyArena& arena,
        ::fidl::Response<::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>
            src) {
  return ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>(
      WireNaturalConversionTraits<
          ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoTopResponse,
          ::fitx::result<uint32_t, ::test_bindingsdenylist::
                                       DenyEachBindingOnlyDenyGoResponse>>::
          ToWire(arena, std::move(src)));
}

::fidl::Response<::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>
WireNaturalConversionTraits<
    ::fidl::WireResponse<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>,
    ::fidl::Response<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>>::
    ToNatural(::fidl::WireResponse<
              ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>
                  src) {
  return ::fidl::Response<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>(
      WireNaturalConversionTraits<
          ::test_bindingsdenylist::wire::
              DenyEachBindingOnlyDenyLibfuzzerTopResponse,
          ::fitx::result<uint32_t,
                         ::test_bindingsdenylist::
                             DenyEachBindingOnlyDenyLibfuzzerResponse>>::
          ToNatural(std::move(src)));
}
::fidl::WireResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>
WireNaturalConversionTraits<
    ::fidl::WireResponse<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>,
    ::fidl::Response<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>>::
    ToWire(fidl::AnyArena& arena,
           ::fidl::Response<
               ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>
               src) {
  return ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>(
      WireNaturalConversionTraits<
          ::test_bindingsdenylist::wire::
              DenyEachBindingOnlyDenyLibfuzzerTopResponse,
          ::fitx::result<uint32_t,
                         ::test_bindingsdenylist::
                             DenyEachBindingOnlyDenyLibfuzzerResponse>>::
          ToWire(arena, std::move(src)));
}

::fidl::Response<::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>
WireNaturalConversionTraits<
    ::fidl::WireResponse<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>,
    ::fidl::Response<::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>>::
    ToNatural(::fidl::WireResponse<
              ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>
                  src) {
  return ::fidl::Response<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>(
      WireNaturalConversionTraits<
          ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustTopResponse,
          ::fitx::result<uint32_t, ::test_bindingsdenylist::
                                       DenyEachBindingOnlyDenyRustResponse>>::
          ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>
WireNaturalConversionTraits<
    ::fidl::WireResponse<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>,
    ::fidl::Response<::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>>::
    ToWire(
        fidl::AnyArena& arena,
        ::fidl::Response<::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>
            src) {
  return ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>(
      WireNaturalConversionTraits<
          ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustTopResponse,
          ::fitx::result<uint32_t, ::test_bindingsdenylist::
                                       DenyEachBindingOnlyDenyRustResponse>>::
          ToWire(arena, std::move(src)));
}

::fidl::Response<::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>
WireNaturalConversionTraits<
    ::fidl::WireResponse<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>,
    ::fidl::Response<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>>::
    ToNatural(::fidl::WireResponse<
              ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>
                  src) {
  return ::fidl::Response<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>(
      WireNaturalConversionTraits<
          ::test_bindingsdenylist::wire::
              DenyEachBindingOnlyDenySyzkallerTopResponse,
          ::fitx::result<uint32_t,
                         ::test_bindingsdenylist::
                             DenyEachBindingOnlyDenySyzkallerResponse>>::
          ToNatural(std::move(src)));
}
::fidl::WireResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>
WireNaturalConversionTraits<
    ::fidl::WireResponse<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>,
    ::fidl::Response<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>>::
    ToWire(fidl::AnyArena& arena,
           ::fidl::Response<
               ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>
               src) {
  return ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>(
      WireNaturalConversionTraits<
          ::test_bindingsdenylist::wire::
              DenyEachBindingOnlyDenySyzkallerTopResponse,
          ::fitx::result<uint32_t,
                         ::test_bindingsdenylist::
                             DenyEachBindingOnlyDenySyzkallerResponse>>::
          ToWire(arena, std::move(src)));
}
#endif  // __Fuchsia__
}  // namespace internal
}  // namespace fidl
