// WARNING: This file is machine generated by fidlgen.
  
  // fidl_experiment = output_index_json

  #pragma once

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

  #include <lib/fidl/cpp/wire/service_handler.h>
  #include <lib/fidl/cpp/hlcpp_conversion.h>

  

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

  namespace fidl {
namespace internal {


  
    template<>
    struct NaturalToHLCPPTraits<fidl::ClientEnd<::test_unknowninteractions::UnknownInteractionsProtocol>> {
      using HLCPPType = fidl::InterfaceHandle<::test::unknowninteractions::UnknownInteractionsProtocol>;
      static inline fidl::InterfaceHandle<::test::unknowninteractions::UnknownInteractionsProtocol> Convert(fidl::ClientEnd<::test_unknowninteractions::UnknownInteractionsProtocol>&& c) {
        return fidl::InterfaceHandle<::test::unknowninteractions::UnknownInteractionsProtocol>(c.TakeChannel());
      }
    };

    template<>
    struct NaturalToHLCPPTraits<fidl::ServerEnd<::test_unknowninteractions::UnknownInteractionsProtocol>> {
      using HLCPPType = fidl::InterfaceRequest<::test::unknowninteractions::UnknownInteractionsProtocol>;
      static inline fidl::InterfaceRequest<::test::unknowninteractions::UnknownInteractionsProtocol> Convert(fidl::ServerEnd<::test_unknowninteractions::UnknownInteractionsProtocol>&& c) {
        return fidl::InterfaceRequest<::test::unknowninteractions::UnknownInteractionsProtocol>(c.TakeChannel());
      }
    };

    template<>
    struct HLCPPToNaturalTraits<fidl::InterfaceHandle<::test::unknowninteractions::UnknownInteractionsProtocol>> {
      using NaturalType = fidl::ClientEnd<::test_unknowninteractions::UnknownInteractionsProtocol>;
      static inline fidl::ClientEnd<::test_unknowninteractions::UnknownInteractionsProtocol> Convert(fidl::InterfaceHandle<::test::unknowninteractions::UnknownInteractionsProtocol>&& c) {
        return fidl::ClientEnd<::test_unknowninteractions::UnknownInteractionsProtocol>(c.TakeChannel());
      }
    };

    template<>
    struct HLCPPToNaturalTraits<fidl::InterfaceRequest<::test::unknowninteractions::UnknownInteractionsProtocol>> {
      using NaturalType = fidl::ServerEnd<::test_unknowninteractions::UnknownInteractionsProtocol>;
      static inline fidl::ServerEnd<::test_unknowninteractions::UnknownInteractionsProtocol> Convert(fidl::InterfaceRequest<::test::unknowninteractions::UnknownInteractionsProtocol>&& c) {
        return fidl::ServerEnd<::test_unknowninteractions::UnknownInteractionsProtocol>(c.TakeChannel());
      }
    };

    template<>
    struct NaturalToHLCPPTraits<fidl::ProtocolHandler<::test_unknowninteractions::UnknownInteractionsProtocol>> {
      using HLCPPType = fidl::InterfaceRequestHandler<::test::unknowninteractions::UnknownInteractionsProtocol>;
      static inline fidl::InterfaceRequestHandler<::test::unknowninteractions::UnknownInteractionsProtocol> Convert(fidl::ProtocolHandler<::test_unknowninteractions::UnknownInteractionsProtocol>&& c) {
        return [c = std::move(c)](fidl::InterfaceRequest<::test::unknowninteractions::UnknownInteractionsProtocol> r) {
          c(::fidl::HLCPPToNatural(r));
        };
      }
    };

    template<>
    struct HLCPPToNaturalTraits<fidl::InterfaceRequestHandler<::test::unknowninteractions::UnknownInteractionsProtocol>> {
      using NaturalType = fidl::ProtocolHandler<::test_unknowninteractions::UnknownInteractionsProtocol>;
      static inline fidl::ProtocolHandler<::test_unknowninteractions::UnknownInteractionsProtocol> Convert(fidl::InterfaceRequestHandler<::test::unknowninteractions::UnknownInteractionsProtocol>&& c) {
        return [c = std::move(c)](fidl::ServerEnd<::test_unknowninteractions::UnknownInteractionsProtocol> r) {
          c(::fidl::NaturalToHLCPP(r));
        };
      }
    };
    template<>
    struct NaturalToHLCPPTraits<fidl::ClientEnd<::test_unknowninteractions::UnknownInteractionsAjarProtocol>> {
      using HLCPPType = fidl::InterfaceHandle<::test::unknowninteractions::UnknownInteractionsAjarProtocol>;
      static inline fidl::InterfaceHandle<::test::unknowninteractions::UnknownInteractionsAjarProtocol> Convert(fidl::ClientEnd<::test_unknowninteractions::UnknownInteractionsAjarProtocol>&& c) {
        return fidl::InterfaceHandle<::test::unknowninteractions::UnknownInteractionsAjarProtocol>(c.TakeChannel());
      }
    };

    template<>
    struct NaturalToHLCPPTraits<fidl::ServerEnd<::test_unknowninteractions::UnknownInteractionsAjarProtocol>> {
      using HLCPPType = fidl::InterfaceRequest<::test::unknowninteractions::UnknownInteractionsAjarProtocol>;
      static inline fidl::InterfaceRequest<::test::unknowninteractions::UnknownInteractionsAjarProtocol> Convert(fidl::ServerEnd<::test_unknowninteractions::UnknownInteractionsAjarProtocol>&& c) {
        return fidl::InterfaceRequest<::test::unknowninteractions::UnknownInteractionsAjarProtocol>(c.TakeChannel());
      }
    };

    template<>
    struct HLCPPToNaturalTraits<fidl::InterfaceHandle<::test::unknowninteractions::UnknownInteractionsAjarProtocol>> {
      using NaturalType = fidl::ClientEnd<::test_unknowninteractions::UnknownInteractionsAjarProtocol>;
      static inline fidl::ClientEnd<::test_unknowninteractions::UnknownInteractionsAjarProtocol> Convert(fidl::InterfaceHandle<::test::unknowninteractions::UnknownInteractionsAjarProtocol>&& c) {
        return fidl::ClientEnd<::test_unknowninteractions::UnknownInteractionsAjarProtocol>(c.TakeChannel());
      }
    };

    template<>
    struct HLCPPToNaturalTraits<fidl::InterfaceRequest<::test::unknowninteractions::UnknownInteractionsAjarProtocol>> {
      using NaturalType = fidl::ServerEnd<::test_unknowninteractions::UnknownInteractionsAjarProtocol>;
      static inline fidl::ServerEnd<::test_unknowninteractions::UnknownInteractionsAjarProtocol> Convert(fidl::InterfaceRequest<::test::unknowninteractions::UnknownInteractionsAjarProtocol>&& c) {
        return fidl::ServerEnd<::test_unknowninteractions::UnknownInteractionsAjarProtocol>(c.TakeChannel());
      }
    };

    template<>
    struct NaturalToHLCPPTraits<fidl::ProtocolHandler<::test_unknowninteractions::UnknownInteractionsAjarProtocol>> {
      using HLCPPType = fidl::InterfaceRequestHandler<::test::unknowninteractions::UnknownInteractionsAjarProtocol>;
      static inline fidl::InterfaceRequestHandler<::test::unknowninteractions::UnknownInteractionsAjarProtocol> Convert(fidl::ProtocolHandler<::test_unknowninteractions::UnknownInteractionsAjarProtocol>&& c) {
        return [c = std::move(c)](fidl::InterfaceRequest<::test::unknowninteractions::UnknownInteractionsAjarProtocol> r) {
          c(::fidl::HLCPPToNatural(r));
        };
      }
    };

    template<>
    struct HLCPPToNaturalTraits<fidl::InterfaceRequestHandler<::test::unknowninteractions::UnknownInteractionsAjarProtocol>> {
      using NaturalType = fidl::ProtocolHandler<::test_unknowninteractions::UnknownInteractionsAjarProtocol>;
      static inline fidl::ProtocolHandler<::test_unknowninteractions::UnknownInteractionsAjarProtocol> Convert(fidl::InterfaceRequestHandler<::test::unknowninteractions::UnknownInteractionsAjarProtocol>&& c) {
        return [c = std::move(c)](fidl::ServerEnd<::test_unknowninteractions::UnknownInteractionsAjarProtocol> r) {
          c(::fidl::NaturalToHLCPP(r));
        };
      }
    };
    template<>
    struct NaturalToHLCPPTraits<fidl::ClientEnd<::test_unknowninteractions::UnknownInteractionsClosedProtocol>> {
      using HLCPPType = fidl::InterfaceHandle<::test::unknowninteractions::UnknownInteractionsClosedProtocol>;
      static inline fidl::InterfaceHandle<::test::unknowninteractions::UnknownInteractionsClosedProtocol> Convert(fidl::ClientEnd<::test_unknowninteractions::UnknownInteractionsClosedProtocol>&& c) {
        return fidl::InterfaceHandle<::test::unknowninteractions::UnknownInteractionsClosedProtocol>(c.TakeChannel());
      }
    };

    template<>
    struct NaturalToHLCPPTraits<fidl::ServerEnd<::test_unknowninteractions::UnknownInteractionsClosedProtocol>> {
      using HLCPPType = fidl::InterfaceRequest<::test::unknowninteractions::UnknownInteractionsClosedProtocol>;
      static inline fidl::InterfaceRequest<::test::unknowninteractions::UnknownInteractionsClosedProtocol> Convert(fidl::ServerEnd<::test_unknowninteractions::UnknownInteractionsClosedProtocol>&& c) {
        return fidl::InterfaceRequest<::test::unknowninteractions::UnknownInteractionsClosedProtocol>(c.TakeChannel());
      }
    };

    template<>
    struct HLCPPToNaturalTraits<fidl::InterfaceHandle<::test::unknowninteractions::UnknownInteractionsClosedProtocol>> {
      using NaturalType = fidl::ClientEnd<::test_unknowninteractions::UnknownInteractionsClosedProtocol>;
      static inline fidl::ClientEnd<::test_unknowninteractions::UnknownInteractionsClosedProtocol> Convert(fidl::InterfaceHandle<::test::unknowninteractions::UnknownInteractionsClosedProtocol>&& c) {
        return fidl::ClientEnd<::test_unknowninteractions::UnknownInteractionsClosedProtocol>(c.TakeChannel());
      }
    };

    template<>
    struct HLCPPToNaturalTraits<fidl::InterfaceRequest<::test::unknowninteractions::UnknownInteractionsClosedProtocol>> {
      using NaturalType = fidl::ServerEnd<::test_unknowninteractions::UnknownInteractionsClosedProtocol>;
      static inline fidl::ServerEnd<::test_unknowninteractions::UnknownInteractionsClosedProtocol> Convert(fidl::InterfaceRequest<::test::unknowninteractions::UnknownInteractionsClosedProtocol>&& c) {
        return fidl::ServerEnd<::test_unknowninteractions::UnknownInteractionsClosedProtocol>(c.TakeChannel());
      }
    };

    template<>
    struct NaturalToHLCPPTraits<fidl::ProtocolHandler<::test_unknowninteractions::UnknownInteractionsClosedProtocol>> {
      using HLCPPType = fidl::InterfaceRequestHandler<::test::unknowninteractions::UnknownInteractionsClosedProtocol>;
      static inline fidl::InterfaceRequestHandler<::test::unknowninteractions::UnknownInteractionsClosedProtocol> Convert(fidl::ProtocolHandler<::test_unknowninteractions::UnknownInteractionsClosedProtocol>&& c) {
        return [c = std::move(c)](fidl::InterfaceRequest<::test::unknowninteractions::UnknownInteractionsClosedProtocol> r) {
          c(::fidl::HLCPPToNatural(r));
        };
      }
    };

    template<>
    struct HLCPPToNaturalTraits<fidl::InterfaceRequestHandler<::test::unknowninteractions::UnknownInteractionsClosedProtocol>> {
      using NaturalType = fidl::ProtocolHandler<::test_unknowninteractions::UnknownInteractionsClosedProtocol>;
      static inline fidl::ProtocolHandler<::test_unknowninteractions::UnknownInteractionsClosedProtocol> Convert(fidl::InterfaceRequestHandler<::test::unknowninteractions::UnknownInteractionsClosedProtocol>&& c) {
        return [c = std::move(c)](fidl::ServerEnd<::test_unknowninteractions::UnknownInteractionsClosedProtocol> r) {
          c(::fidl::NaturalToHLCPP(r));
        };
      }
    };

  
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsResponse;
      static inline ::test::unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsResponse Convert(::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsResponse> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsResponse Convert(::test::unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsResponse&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayErrResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayErr_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayErr_Response Convert(::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayErrResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayErr_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayErrResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayErrResponse Convert(::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayErr_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayFieldsErr_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayFieldsErr_Response Convert(::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayFieldsErr_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResponse Convert(::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayFieldsErr_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWay_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWay_Response Convert(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWay_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayResponse Convert(::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWay_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFields_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFields_Response Convert(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFields_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsResponse Convert(::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFields_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayErr_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayErr_Response Convert(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayErr_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResponse Convert(::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayErr_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFieldsErr_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFieldsErr_Response Convert(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFieldsErr_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResponse Convert(::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFieldsErr_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolStrictEventFieldsRequest> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsProtocolStrictEventFieldsRequest;
      static inline ::test::unknowninteractions::UnknownInteractionsProtocolStrictEventFieldsRequest Convert(::test_unknowninteractions::UnknownInteractionsProtocolStrictEventFieldsRequest&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocolStrictEventFieldsRequest> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsProtocolStrictEventFieldsRequest;
      static inline ::test_unknowninteractions::UnknownInteractionsProtocolStrictEventFieldsRequest Convert(::test::unknowninteractions::UnknownInteractionsProtocolStrictEventFieldsRequest&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventFieldsRequest> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsProtocolFlexibleEventFieldsRequest;
      static inline ::test::unknowninteractions::UnknownInteractionsProtocolFlexibleEventFieldsRequest Convert(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventFieldsRequest&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocolFlexibleEventFieldsRequest> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventFieldsRequest;
      static inline ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventFieldsRequest Convert(::test::unknowninteractions::UnknownInteractionsProtocolFlexibleEventFieldsRequest&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsResponse;
      static inline ::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsResponse Convert(::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsResponse> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsResponse Convert(::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsResponse&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayErrResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayErr_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayErr_Response Convert(::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayErrResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayErr_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayErrResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayErrResponse Convert(::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayErr_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayFieldsErr_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayFieldsErr_Response Convert(::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayFieldsErr_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResponse Convert(::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayFieldsErr_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventFieldsRequest> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictEventFieldsRequest;
      static inline ::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictEventFieldsRequest Convert(::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventFieldsRequest&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictEventFieldsRequest> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventFieldsRequest;
      static inline ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventFieldsRequest Convert(::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictEventFieldsRequest&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventFieldsRequest> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventFieldsRequest;
      static inline ::test::unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventFieldsRequest Convert(::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventFieldsRequest&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventFieldsRequest> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventFieldsRequest;
      static inline ::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventFieldsRequest Convert(::test::unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventFieldsRequest&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsResponse;
      static inline ::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsResponse Convert(::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsResponse> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsResponse Convert(::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsResponse&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayErrResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayErr_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayErr_Response Convert(::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayErrResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayErr_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayErrResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayErrResponse Convert(::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayErr_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayFieldsErr_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayFieldsErr_Response Convert(::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayFieldsErr_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResponse Convert(::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayFieldsErr_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventFieldsRequest> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictEventFieldsRequest;
      static inline ::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictEventFieldsRequest Convert(::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventFieldsRequest&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictEventFieldsRequest> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventFieldsRequest;
      static inline ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventFieldsRequest Convert(::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictEventFieldsRequest&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsResponse;
      static inline ::test::unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsResponse Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsResponse> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsResponse Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsResponse&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayErrResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayErr_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayErr_Response Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayErrResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayErr_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayErrResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayErrResponse Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayErr_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayFieldsErr_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayFieldsErr_Response Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayFieldsErr_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResponse Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayFieldsErr_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWay_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWay_Response Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWay_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayResponse Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWay_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFields_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFields_Response Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFields_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResponse Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFields_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayErr_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayErr_Response Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayErr_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResponse Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayErr_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFieldsErr_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFieldsErr_Response Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFieldsErr_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResponse Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFieldsErr_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsResponse;
      static inline ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsResponse Convert(::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsResponse> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsResponse Convert(::test::unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsResponse&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayErr_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayErr_Response Convert(::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayErr_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResponse Convert(::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayErr_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayFieldsErr_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayFieldsErr_Response Convert(::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayFieldsErr_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResponse Convert(::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayFieldsErr_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsResponse;
      static inline ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsResponse Convert(::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsResponse> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsResponse Convert(::test::unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsResponse&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayErr_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayErr_Response Convert(::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayErr_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResponse Convert(::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayErr_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayFieldsErr_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayFieldsErr_Response Convert(::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayFieldsErr_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResponse Convert(::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayFieldsErr_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableResponse;
      static inline ::test::unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableResponse Convert(::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableResponse> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableResponse Convert(::test::unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableResponse&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayTableErr_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayTableErr_Response Convert(::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayTableErr_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResponse Convert(::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayTableErr_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTable_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTable_Response Convert(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTable_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableResponse Convert(::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTable_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTableErr_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTableErr_Response Convert(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTableErr_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResponse Convert(::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTableErr_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolStrictEventTableRequest> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsProtocolStrictEventTableRequest;
      static inline ::test::unknowninteractions::UnknownInteractionsProtocolStrictEventTableRequest Convert(::test_unknowninteractions::UnknownInteractionsProtocolStrictEventTableRequest&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocolStrictEventTableRequest> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsProtocolStrictEventTableRequest;
      static inline ::test_unknowninteractions::UnknownInteractionsProtocolStrictEventTableRequest Convert(::test::unknowninteractions::UnknownInteractionsProtocolStrictEventTableRequest&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventTableRequest> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsProtocolFlexibleEventTableRequest;
      static inline ::test::unknowninteractions::UnknownInteractionsProtocolFlexibleEventTableRequest Convert(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventTableRequest&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocolFlexibleEventTableRequest> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventTableRequest;
      static inline ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventTableRequest Convert(::test::unknowninteractions::UnknownInteractionsProtocolFlexibleEventTableRequest&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableResponse;
      static inline ::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableResponse Convert(::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableResponse> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableResponse Convert(::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableResponse&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayTableErr_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayTableErr_Response Convert(::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayTableErr_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResponse Convert(::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayTableErr_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventTableRequest> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictEventTableRequest;
      static inline ::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictEventTableRequest Convert(::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventTableRequest&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictEventTableRequest> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventTableRequest;
      static inline ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventTableRequest Convert(::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictEventTableRequest&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventTableRequest> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventTableRequest;
      static inline ::test::unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventTableRequest Convert(::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventTableRequest&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventTableRequest> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventTableRequest;
      static inline ::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventTableRequest Convert(::test::unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventTableRequest&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableResponse;
      static inline ::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableResponse Convert(::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableResponse> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableResponse Convert(::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableResponse&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayTableErr_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayTableErr_Response Convert(::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayTableErr_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResponse Convert(::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayTableErr_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventTableRequest> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictEventTableRequest;
      static inline ::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictEventTableRequest Convert(::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventTableRequest&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictEventTableRequest> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventTableRequest;
      static inline ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventTableRequest Convert(::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictEventTableRequest&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableResponse;
      static inline ::test::unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableResponse Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableResponse> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableResponse Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableResponse&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayTableErr_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayTableErr_Response Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayTableErr_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResponse Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayTableErr_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTable_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTable_Response Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTable_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResponse Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTable_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTableErr_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTableErr_Response Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTableErr_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResponse Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTableErr_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableResponse;
      static inline ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableResponse Convert(::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableResponse> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableResponse Convert(::test::unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableResponse&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayTableErr_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayTableErr_Response Convert(::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayTableErr_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResponse Convert(::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayTableErr_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableResponse;
      static inline ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableResponse Convert(::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableResponse> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableResponse Convert(::test::unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableResponse&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayTableErr_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayTableErr_Response Convert(::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayTableErr_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResponse Convert(::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayTableErr_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionResponse;
      static inline ::test::unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionResponse Convert(::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionResponse> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionResponse Convert(::test::unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionResponse&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayErrResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayErr_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayErr_Result Convert(::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayErrResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayErr_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayErrResult;
      static inline ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayErrResult Convert(::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayErr_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayFieldsErr_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayFieldsErr_Result Convert(::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayFieldsErr_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResult;
      static inline ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResult Convert(::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayFieldsErr_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayUnionErr_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayUnionErr_Response Convert(::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayUnionErr_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResponse Convert(::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayUnionErr_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayUnionErr_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayUnionErr_Result Convert(::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayUnionErr_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResult;
      static inline ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResult Convert(::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayUnionErr_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayTableErr_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayTableErr_Result Convert(::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayTableErr_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResult;
      static inline ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResult Convert(::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayTableErr_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWay_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWay_Result Convert(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWay_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayResult;
      static inline ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayResult Convert(::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWay_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFields_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFields_Result Convert(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFields_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsResult;
      static inline ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsResult Convert(::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFields_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnion_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnion_Response Convert(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnion_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResponse Convert(::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnion_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnion_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnion_Result Convert(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnion_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResult;
      static inline ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResult Convert(::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnion_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTable_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTable_Result Convert(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTable_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableResult;
      static inline ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableResult Convert(::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTable_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayErr_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayErr_Result Convert(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayErr_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResult;
      static inline ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResult Convert(::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayErr_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFieldsErr_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFieldsErr_Result Convert(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFieldsErr_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResult;
      static inline ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResult Convert(::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFieldsErr_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnionErr_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnionErr_Response Convert(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnionErr_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResponse Convert(::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnionErr_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnionErr_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnionErr_Result Convert(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnionErr_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResult;
      static inline ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResult Convert(::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnionErr_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTableErr_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTableErr_Result Convert(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTableErr_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResult;
      static inline ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResult Convert(::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTableErr_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolStrictEventUnionRequest> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsProtocolStrictEventUnionRequest;
      static inline ::test::unknowninteractions::UnknownInteractionsProtocolStrictEventUnionRequest Convert(::test_unknowninteractions::UnknownInteractionsProtocolStrictEventUnionRequest&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocolStrictEventUnionRequest> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsProtocolStrictEventUnionRequest;
      static inline ::test_unknowninteractions::UnknownInteractionsProtocolStrictEventUnionRequest Convert(::test::unknowninteractions::UnknownInteractionsProtocolStrictEventUnionRequest&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventUnionRequest> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsProtocolFlexibleEventUnionRequest;
      static inline ::test::unknowninteractions::UnknownInteractionsProtocolFlexibleEventUnionRequest Convert(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventUnionRequest&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocolFlexibleEventUnionRequest> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventUnionRequest;
      static inline ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventUnionRequest Convert(::test::unknowninteractions::UnknownInteractionsProtocolFlexibleEventUnionRequest&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionResponse;
      static inline ::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionResponse Convert(::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionResponse> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionResponse Convert(::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionResponse&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayErrResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayErr_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayErr_Result Convert(::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayErrResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayErr_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayErrResult;
      static inline ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayErrResult Convert(::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayErr_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayFieldsErr_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayFieldsErr_Result Convert(::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayFieldsErr_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResult;
      static inline ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResult Convert(::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayFieldsErr_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayUnionErr_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayUnionErr_Response Convert(::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayUnionErr_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResponse Convert(::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayUnionErr_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayUnionErr_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayUnionErr_Result Convert(::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayUnionErr_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResult;
      static inline ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResult Convert(::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayUnionErr_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayTableErr_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayTableErr_Result Convert(::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayTableErr_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResult;
      static inline ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResult Convert(::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayTableErr_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventUnionRequest> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictEventUnionRequest;
      static inline ::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictEventUnionRequest Convert(::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventUnionRequest&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictEventUnionRequest> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventUnionRequest;
      static inline ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventUnionRequest Convert(::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictEventUnionRequest&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventUnionRequest> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventUnionRequest;
      static inline ::test::unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventUnionRequest Convert(::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventUnionRequest&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventUnionRequest> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventUnionRequest;
      static inline ::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventUnionRequest Convert(::test::unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventUnionRequest&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionResponse;
      static inline ::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionResponse Convert(::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionResponse> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionResponse Convert(::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionResponse&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayErrResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayErr_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayErr_Result Convert(::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayErrResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayErr_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayErrResult;
      static inline ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayErrResult Convert(::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayErr_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayFieldsErr_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayFieldsErr_Result Convert(::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayFieldsErr_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResult;
      static inline ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResult Convert(::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayFieldsErr_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayUnionErr_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayUnionErr_Response Convert(::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayUnionErr_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResponse Convert(::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayUnionErr_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayUnionErr_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayUnionErr_Result Convert(::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayUnionErr_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResult;
      static inline ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResult Convert(::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayUnionErr_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayTableErr_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayTableErr_Result Convert(::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayTableErr_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResult;
      static inline ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResult Convert(::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayTableErr_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventUnionRequest> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictEventUnionRequest;
      static inline ::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictEventUnionRequest Convert(::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventUnionRequest&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictEventUnionRequest> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventUnionRequest;
      static inline ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventUnionRequest Convert(::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictEventUnionRequest&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionResponse;
      static inline ::test::unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionResponse Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionResponse> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionResponse Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionResponse&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayErrResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayErr_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayErr_Result Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayErrResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayErr_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayErrResult;
      static inline ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayErrResult Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayErr_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayFieldsErr_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayFieldsErr_Result Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayFieldsErr_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResult;
      static inline ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResult Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayFieldsErr_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayUnionErr_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayUnionErr_Response Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayUnionErr_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResponse Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayUnionErr_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayUnionErr_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayUnionErr_Result Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayUnionErr_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResult;
      static inline ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResult Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayUnionErr_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayTableErr_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayTableErr_Result Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayTableErr_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResult;
      static inline ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResult Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayTableErr_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWay_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWay_Result Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWay_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayResult;
      static inline ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayResult Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWay_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFields_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFields_Result Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFields_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResult;
      static inline ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResult Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFields_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnion_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnion_Response Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnion_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResponse Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnion_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnion_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnion_Result Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnion_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResult;
      static inline ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResult Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnion_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTable_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTable_Result Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTable_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResult;
      static inline ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResult Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTable_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayErr_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayErr_Result Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayErr_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResult;
      static inline ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResult Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayErr_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFieldsErr_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFieldsErr_Result Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFieldsErr_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResult;
      static inline ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResult Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFieldsErr_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnionErr_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnionErr_Response Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnionErr_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResponse Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnionErr_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnionErr_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnionErr_Result Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnionErr_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResult;
      static inline ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResult Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnionErr_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTableErr_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTableErr_Result Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTableErr_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResult;
      static inline ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResult Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTableErr_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionResponse;
      static inline ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionResponse Convert(::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionResponse> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionResponse Convert(::test::unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionResponse&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayErr_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayErr_Result Convert(::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayErr_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResult;
      static inline ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResult Convert(::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayErr_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayFieldsErr_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayFieldsErr_Result Convert(::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayFieldsErr_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResult;
      static inline ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResult Convert(::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayFieldsErr_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayUnionErr_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayUnionErr_Response Convert(::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayUnionErr_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResponse Convert(::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayUnionErr_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayUnionErr_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayUnionErr_Result Convert(::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayUnionErr_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResult;
      static inline ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResult Convert(::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayUnionErr_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayTableErr_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayTableErr_Result Convert(::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayTableErr_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResult;
      static inline ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResult Convert(::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayTableErr_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionResponse;
      static inline ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionResponse Convert(::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionResponse> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionResponse Convert(::test::unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionResponse&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayErr_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayErr_Result Convert(::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayErr_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResult;
      static inline ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResult Convert(::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayErr_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayFieldsErr_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayFieldsErr_Result Convert(::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayFieldsErr_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResult;
      static inline ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResult Convert(::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayFieldsErr_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResponse> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayUnionErr_Response;
      static inline ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayUnionErr_Response Convert(::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResponse&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayUnionErr_Response> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResponse;
      static inline ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResponse Convert(::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayUnionErr_Response&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayUnionErr_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayUnionErr_Result Convert(::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayUnionErr_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResult;
      static inline ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResult Convert(::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayUnionErr_Result&&);
    };
    template<>
    struct NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResult> {
      using HLCPPType = ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayTableErr_Result;
      static inline ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayTableErr_Result Convert(::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResult&&);
    };
    template<>
    struct HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayTableErr_Result> {
      using NaturalType = ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResult;
      static inline ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResult Convert(::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayTableErr_Result&&);
    };

  
    ::test::unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsResponse NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsResponse>::Convert(::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsResponse hlcpp;
        hlcpp.some_field = ::fidl::NaturalToHLCPP(std::move(value.some_field()));
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsResponse>::Convert(::test::unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsResponse&& value) {
      return ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsResponse{ {
          .some_field = ::fidl::HLCPPToNatural(std::move(value.some_field)),
      } };
    }
    ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayErr_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayErrResponse>::Convert(::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayErrResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayErr_Response hlcpp;
        hlcpp.__reserved = ::fidl::NaturalToHLCPP(std::move(value.__reserved()));
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayErrResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayErr_Response>::Convert(::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayErr_Response&& value) {
      return ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayErrResponse{ {
          .__reserved = ::fidl::HLCPPToNatural(std::move(value.__reserved)),
      } };
    }
    ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayFieldsErr_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResponse>::Convert(::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayFieldsErr_Response hlcpp;
        hlcpp.some_field = ::fidl::NaturalToHLCPP(std::move(value.some_field()));
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayFieldsErr_Response>::Convert(::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayFieldsErr_Response&& value) {
      return ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResponse{ {
          .some_field = ::fidl::HLCPPToNatural(std::move(value.some_field)),
      } };
    }
    ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWay_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayResponse>::Convert(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWay_Response hlcpp;
        hlcpp.__reserved = ::fidl::NaturalToHLCPP(std::move(value.__reserved()));
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWay_Response>::Convert(::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWay_Response&& value) {
      return ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayResponse{ {
          .__reserved = ::fidl::HLCPPToNatural(std::move(value.__reserved)),
      } };
    }
    ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFields_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsResponse>::Convert(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFields_Response hlcpp;
        hlcpp.some_field = ::fidl::NaturalToHLCPP(std::move(value.some_field()));
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFields_Response>::Convert(::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFields_Response&& value) {
      return ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsResponse{ {
          .some_field = ::fidl::HLCPPToNatural(std::move(value.some_field)),
      } };
    }
    ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayErr_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResponse>::Convert(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayErr_Response hlcpp;
        hlcpp.__reserved = ::fidl::NaturalToHLCPP(std::move(value.__reserved()));
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayErr_Response>::Convert(::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayErr_Response&& value) {
      return ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResponse{ {
          .__reserved = ::fidl::HLCPPToNatural(std::move(value.__reserved)),
      } };
    }
    ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFieldsErr_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResponse>::Convert(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFieldsErr_Response hlcpp;
        hlcpp.some_field = ::fidl::NaturalToHLCPP(std::move(value.some_field()));
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFieldsErr_Response>::Convert(::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFieldsErr_Response&& value) {
      return ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResponse{ {
          .some_field = ::fidl::HLCPPToNatural(std::move(value.some_field)),
      } };
    }
    ::test::unknowninteractions::UnknownInteractionsProtocolStrictEventFieldsRequest NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolStrictEventFieldsRequest>::Convert(::test_unknowninteractions::UnknownInteractionsProtocolStrictEventFieldsRequest&& value) {
      ::test::unknowninteractions::UnknownInteractionsProtocolStrictEventFieldsRequest hlcpp;
        hlcpp.some_field = ::fidl::NaturalToHLCPP(std::move(value.some_field()));
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsProtocolStrictEventFieldsRequest HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocolStrictEventFieldsRequest>::Convert(::test::unknowninteractions::UnknownInteractionsProtocolStrictEventFieldsRequest&& value) {
      return ::test_unknowninteractions::UnknownInteractionsProtocolStrictEventFieldsRequest{ {
          .some_field = ::fidl::HLCPPToNatural(std::move(value.some_field)),
      } };
    }
    ::test::unknowninteractions::UnknownInteractionsProtocolFlexibleEventFieldsRequest NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventFieldsRequest>::Convert(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventFieldsRequest&& value) {
      ::test::unknowninteractions::UnknownInteractionsProtocolFlexibleEventFieldsRequest hlcpp;
        hlcpp.some_field = ::fidl::NaturalToHLCPP(std::move(value.some_field()));
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventFieldsRequest HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocolFlexibleEventFieldsRequest>::Convert(::test::unknowninteractions::UnknownInteractionsProtocolFlexibleEventFieldsRequest&& value) {
      return ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventFieldsRequest{ {
          .some_field = ::fidl::HLCPPToNatural(std::move(value.some_field)),
      } };
    }
    ::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsResponse NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsResponse>::Convert(::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsResponse hlcpp;
        hlcpp.some_field = ::fidl::NaturalToHLCPP(std::move(value.some_field()));
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsResponse>::Convert(::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsResponse&& value) {
      return ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsResponse{ {
          .some_field = ::fidl::HLCPPToNatural(std::move(value.some_field)),
      } };
    }
    ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayErr_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayErrResponse>::Convert(::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayErrResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayErr_Response hlcpp;
        hlcpp.__reserved = ::fidl::NaturalToHLCPP(std::move(value.__reserved()));
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayErrResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayErr_Response>::Convert(::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayErr_Response&& value) {
      return ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayErrResponse{ {
          .__reserved = ::fidl::HLCPPToNatural(std::move(value.__reserved)),
      } };
    }
    ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayFieldsErr_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResponse>::Convert(::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayFieldsErr_Response hlcpp;
        hlcpp.some_field = ::fidl::NaturalToHLCPP(std::move(value.some_field()));
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayFieldsErr_Response>::Convert(::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayFieldsErr_Response&& value) {
      return ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResponse{ {
          .some_field = ::fidl::HLCPPToNatural(std::move(value.some_field)),
      } };
    }
    ::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictEventFieldsRequest NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventFieldsRequest>::Convert(::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventFieldsRequest&& value) {
      ::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictEventFieldsRequest hlcpp;
        hlcpp.some_field = ::fidl::NaturalToHLCPP(std::move(value.some_field()));
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventFieldsRequest HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictEventFieldsRequest>::Convert(::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictEventFieldsRequest&& value) {
      return ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventFieldsRequest{ {
          .some_field = ::fidl::HLCPPToNatural(std::move(value.some_field)),
      } };
    }
    ::test::unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventFieldsRequest NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventFieldsRequest>::Convert(::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventFieldsRequest&& value) {
      ::test::unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventFieldsRequest hlcpp;
        hlcpp.some_field = ::fidl::NaturalToHLCPP(std::move(value.some_field()));
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventFieldsRequest HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventFieldsRequest>::Convert(::test::unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventFieldsRequest&& value) {
      return ::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventFieldsRequest{ {
          .some_field = ::fidl::HLCPPToNatural(std::move(value.some_field)),
      } };
    }
    ::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsResponse NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsResponse>::Convert(::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsResponse hlcpp;
        hlcpp.some_field = ::fidl::NaturalToHLCPP(std::move(value.some_field()));
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsResponse>::Convert(::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsResponse&& value) {
      return ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsResponse{ {
          .some_field = ::fidl::HLCPPToNatural(std::move(value.some_field)),
      } };
    }
    ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayErr_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayErrResponse>::Convert(::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayErrResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayErr_Response hlcpp;
        hlcpp.__reserved = ::fidl::NaturalToHLCPP(std::move(value.__reserved()));
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayErrResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayErr_Response>::Convert(::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayErr_Response&& value) {
      return ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayErrResponse{ {
          .__reserved = ::fidl::HLCPPToNatural(std::move(value.__reserved)),
      } };
    }
    ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayFieldsErr_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResponse>::Convert(::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayFieldsErr_Response hlcpp;
        hlcpp.some_field = ::fidl::NaturalToHLCPP(std::move(value.some_field()));
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayFieldsErr_Response>::Convert(::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayFieldsErr_Response&& value) {
      return ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResponse{ {
          .some_field = ::fidl::HLCPPToNatural(std::move(value.some_field)),
      } };
    }
    ::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictEventFieldsRequest NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventFieldsRequest>::Convert(::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventFieldsRequest&& value) {
      ::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictEventFieldsRequest hlcpp;
        hlcpp.some_field = ::fidl::NaturalToHLCPP(std::move(value.some_field()));
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventFieldsRequest HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictEventFieldsRequest>::Convert(::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictEventFieldsRequest&& value) {
      return ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventFieldsRequest{ {
          .some_field = ::fidl::HLCPPToNatural(std::move(value.some_field)),
      } };
    }
    ::test::unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsResponse NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsResponse>::Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsResponse hlcpp;
        hlcpp.some_field = ::fidl::NaturalToHLCPP(std::move(value.some_field()));
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsResponse>::Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsResponse&& value) {
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsResponse{ {
          .some_field = ::fidl::HLCPPToNatural(std::move(value.some_field)),
      } };
    }
    ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayErr_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayErrResponse>::Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayErrResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayErr_Response hlcpp;
        hlcpp.__reserved = ::fidl::NaturalToHLCPP(std::move(value.__reserved()));
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayErrResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayErr_Response>::Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayErr_Response&& value) {
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayErrResponse{ {
          .__reserved = ::fidl::HLCPPToNatural(std::move(value.__reserved)),
      } };
    }
    ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayFieldsErr_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResponse>::Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayFieldsErr_Response hlcpp;
        hlcpp.some_field = ::fidl::NaturalToHLCPP(std::move(value.some_field()));
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayFieldsErr_Response>::Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayFieldsErr_Response&& value) {
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResponse{ {
          .some_field = ::fidl::HLCPPToNatural(std::move(value.some_field)),
      } };
    }
    ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWay_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayResponse>::Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWay_Response hlcpp;
        hlcpp.__reserved = ::fidl::NaturalToHLCPP(std::move(value.__reserved()));
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWay_Response>::Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWay_Response&& value) {
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayResponse{ {
          .__reserved = ::fidl::HLCPPToNatural(std::move(value.__reserved)),
      } };
    }
    ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFields_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResponse>::Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFields_Response hlcpp;
        hlcpp.some_field = ::fidl::NaturalToHLCPP(std::move(value.some_field()));
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFields_Response>::Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFields_Response&& value) {
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResponse{ {
          .some_field = ::fidl::HLCPPToNatural(std::move(value.some_field)),
      } };
    }
    ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayErr_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResponse>::Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayErr_Response hlcpp;
        hlcpp.__reserved = ::fidl::NaturalToHLCPP(std::move(value.__reserved()));
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayErr_Response>::Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayErr_Response&& value) {
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResponse{ {
          .__reserved = ::fidl::HLCPPToNatural(std::move(value.__reserved)),
      } };
    }
    ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFieldsErr_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResponse>::Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFieldsErr_Response hlcpp;
        hlcpp.some_field = ::fidl::NaturalToHLCPP(std::move(value.some_field()));
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFieldsErr_Response>::Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFieldsErr_Response&& value) {
      return ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResponse{ {
          .some_field = ::fidl::HLCPPToNatural(std::move(value.some_field)),
      } };
    }
    ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsResponse NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsResponse>::Convert(::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsResponse hlcpp;
        hlcpp.some_field = ::fidl::NaturalToHLCPP(std::move(value.some_field()));
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsResponse>::Convert(::test::unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsResponse&& value) {
      return ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsResponse{ {
          .some_field = ::fidl::HLCPPToNatural(std::move(value.some_field)),
      } };
    }
    ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayErr_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResponse>::Convert(::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayErr_Response hlcpp;
        hlcpp.__reserved = ::fidl::NaturalToHLCPP(std::move(value.__reserved()));
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayErr_Response>::Convert(::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayErr_Response&& value) {
      return ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResponse{ {
          .__reserved = ::fidl::HLCPPToNatural(std::move(value.__reserved)),
      } };
    }
    ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayFieldsErr_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResponse>::Convert(::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayFieldsErr_Response hlcpp;
        hlcpp.some_field = ::fidl::NaturalToHLCPP(std::move(value.some_field()));
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayFieldsErr_Response>::Convert(::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayFieldsErr_Response&& value) {
      return ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResponse{ {
          .some_field = ::fidl::HLCPPToNatural(std::move(value.some_field)),
      } };
    }
    ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsResponse NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsResponse>::Convert(::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsResponse hlcpp;
        hlcpp.some_field = ::fidl::NaturalToHLCPP(std::move(value.some_field()));
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsResponse>::Convert(::test::unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsResponse&& value) {
      return ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsResponse{ {
          .some_field = ::fidl::HLCPPToNatural(std::move(value.some_field)),
      } };
    }
    ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayErr_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResponse>::Convert(::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayErr_Response hlcpp;
        hlcpp.__reserved = ::fidl::NaturalToHLCPP(std::move(value.__reserved()));
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayErr_Response>::Convert(::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayErr_Response&& value) {
      return ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResponse{ {
          .__reserved = ::fidl::HLCPPToNatural(std::move(value.__reserved)),
      } };
    }
    ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayFieldsErr_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResponse>::Convert(::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayFieldsErr_Response hlcpp;
        hlcpp.some_field = ::fidl::NaturalToHLCPP(std::move(value.some_field()));
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayFieldsErr_Response>::Convert(::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayFieldsErr_Response&& value) {
      return ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResponse{ {
          .some_field = ::fidl::HLCPPToNatural(std::move(value.some_field)),
      } };
    }
    ::test::unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableResponse NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableResponse>::Convert(::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableResponse hlcpp;
        if (value.some_field().has_value()) {
          hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
        }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableResponse>::Convert(::test::unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableResponse&& value) {
      ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableResponse natural;
        if (value.has_some_field()) {
          natural.some_field() = ::fidl::HLCPPToNatural(std::move(*value.mutable_some_field()));
        }
      return natural;
    }
    ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayTableErr_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResponse>::Convert(::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayTableErr_Response hlcpp;
        if (value.some_field().has_value()) {
          hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
        }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayTableErr_Response>::Convert(::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayTableErr_Response&& value) {
      ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResponse natural;
        if (value.has_some_field()) {
          natural.some_field() = ::fidl::HLCPPToNatural(std::move(*value.mutable_some_field()));
        }
      return natural;
    }
    ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTable_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableResponse>::Convert(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTable_Response hlcpp;
        if (value.some_field().has_value()) {
          hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
        }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTable_Response>::Convert(::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTable_Response&& value) {
      ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableResponse natural;
        if (value.has_some_field()) {
          natural.some_field() = ::fidl::HLCPPToNatural(std::move(*value.mutable_some_field()));
        }
      return natural;
    }
    ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTableErr_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResponse>::Convert(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTableErr_Response hlcpp;
        if (value.some_field().has_value()) {
          hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
        }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTableErr_Response>::Convert(::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTableErr_Response&& value) {
      ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResponse natural;
        if (value.has_some_field()) {
          natural.some_field() = ::fidl::HLCPPToNatural(std::move(*value.mutable_some_field()));
        }
      return natural;
    }
    ::test::unknowninteractions::UnknownInteractionsProtocolStrictEventTableRequest NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolStrictEventTableRequest>::Convert(::test_unknowninteractions::UnknownInteractionsProtocolStrictEventTableRequest&& value) {
      ::test::unknowninteractions::UnknownInteractionsProtocolStrictEventTableRequest hlcpp;
        if (value.some_field().has_value()) {
          hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
        }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsProtocolStrictEventTableRequest HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocolStrictEventTableRequest>::Convert(::test::unknowninteractions::UnknownInteractionsProtocolStrictEventTableRequest&& value) {
      ::test_unknowninteractions::UnknownInteractionsProtocolStrictEventTableRequest natural;
        if (value.has_some_field()) {
          natural.some_field() = ::fidl::HLCPPToNatural(std::move(*value.mutable_some_field()));
        }
      return natural;
    }
    ::test::unknowninteractions::UnknownInteractionsProtocolFlexibleEventTableRequest NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventTableRequest>::Convert(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventTableRequest&& value) {
      ::test::unknowninteractions::UnknownInteractionsProtocolFlexibleEventTableRequest hlcpp;
        if (value.some_field().has_value()) {
          hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
        }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventTableRequest HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocolFlexibleEventTableRequest>::Convert(::test::unknowninteractions::UnknownInteractionsProtocolFlexibleEventTableRequest&& value) {
      ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventTableRequest natural;
        if (value.has_some_field()) {
          natural.some_field() = ::fidl::HLCPPToNatural(std::move(*value.mutable_some_field()));
        }
      return natural;
    }
    ::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableResponse NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableResponse>::Convert(::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableResponse hlcpp;
        if (value.some_field().has_value()) {
          hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
        }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableResponse>::Convert(::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableResponse&& value) {
      ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableResponse natural;
        if (value.has_some_field()) {
          natural.some_field() = ::fidl::HLCPPToNatural(std::move(*value.mutable_some_field()));
        }
      return natural;
    }
    ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayTableErr_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResponse>::Convert(::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayTableErr_Response hlcpp;
        if (value.some_field().has_value()) {
          hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
        }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayTableErr_Response>::Convert(::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayTableErr_Response&& value) {
      ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResponse natural;
        if (value.has_some_field()) {
          natural.some_field() = ::fidl::HLCPPToNatural(std::move(*value.mutable_some_field()));
        }
      return natural;
    }
    ::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictEventTableRequest NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventTableRequest>::Convert(::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventTableRequest&& value) {
      ::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictEventTableRequest hlcpp;
        if (value.some_field().has_value()) {
          hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
        }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventTableRequest HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictEventTableRequest>::Convert(::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictEventTableRequest&& value) {
      ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventTableRequest natural;
        if (value.has_some_field()) {
          natural.some_field() = ::fidl::HLCPPToNatural(std::move(*value.mutable_some_field()));
        }
      return natural;
    }
    ::test::unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventTableRequest NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventTableRequest>::Convert(::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventTableRequest&& value) {
      ::test::unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventTableRequest hlcpp;
        if (value.some_field().has_value()) {
          hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
        }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventTableRequest HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventTableRequest>::Convert(::test::unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventTableRequest&& value) {
      ::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventTableRequest natural;
        if (value.has_some_field()) {
          natural.some_field() = ::fidl::HLCPPToNatural(std::move(*value.mutable_some_field()));
        }
      return natural;
    }
    ::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableResponse NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableResponse>::Convert(::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableResponse hlcpp;
        if (value.some_field().has_value()) {
          hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
        }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableResponse>::Convert(::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableResponse&& value) {
      ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableResponse natural;
        if (value.has_some_field()) {
          natural.some_field() = ::fidl::HLCPPToNatural(std::move(*value.mutable_some_field()));
        }
      return natural;
    }
    ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayTableErr_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResponse>::Convert(::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayTableErr_Response hlcpp;
        if (value.some_field().has_value()) {
          hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
        }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayTableErr_Response>::Convert(::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayTableErr_Response&& value) {
      ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResponse natural;
        if (value.has_some_field()) {
          natural.some_field() = ::fidl::HLCPPToNatural(std::move(*value.mutable_some_field()));
        }
      return natural;
    }
    ::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictEventTableRequest NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventTableRequest>::Convert(::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventTableRequest&& value) {
      ::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictEventTableRequest hlcpp;
        if (value.some_field().has_value()) {
          hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
        }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventTableRequest HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictEventTableRequest>::Convert(::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictEventTableRequest&& value) {
      ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventTableRequest natural;
        if (value.has_some_field()) {
          natural.some_field() = ::fidl::HLCPPToNatural(std::move(*value.mutable_some_field()));
        }
      return natural;
    }
    ::test::unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableResponse NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableResponse>::Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableResponse hlcpp;
        if (value.some_field().has_value()) {
          hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
        }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableResponse>::Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableResponse&& value) {
      ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableResponse natural;
        if (value.has_some_field()) {
          natural.some_field() = ::fidl::HLCPPToNatural(std::move(*value.mutable_some_field()));
        }
      return natural;
    }
    ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayTableErr_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResponse>::Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayTableErr_Response hlcpp;
        if (value.some_field().has_value()) {
          hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
        }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayTableErr_Response>::Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayTableErr_Response&& value) {
      ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResponse natural;
        if (value.has_some_field()) {
          natural.some_field() = ::fidl::HLCPPToNatural(std::move(*value.mutable_some_field()));
        }
      return natural;
    }
    ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTable_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResponse>::Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTable_Response hlcpp;
        if (value.some_field().has_value()) {
          hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
        }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTable_Response>::Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTable_Response&& value) {
      ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResponse natural;
        if (value.has_some_field()) {
          natural.some_field() = ::fidl::HLCPPToNatural(std::move(*value.mutable_some_field()));
        }
      return natural;
    }
    ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTableErr_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResponse>::Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTableErr_Response hlcpp;
        if (value.some_field().has_value()) {
          hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
        }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTableErr_Response>::Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTableErr_Response&& value) {
      ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResponse natural;
        if (value.has_some_field()) {
          natural.some_field() = ::fidl::HLCPPToNatural(std::move(*value.mutable_some_field()));
        }
      return natural;
    }
    ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableResponse NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableResponse>::Convert(::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableResponse hlcpp;
        if (value.some_field().has_value()) {
          hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
        }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableResponse>::Convert(::test::unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableResponse&& value) {
      ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableResponse natural;
        if (value.has_some_field()) {
          natural.some_field() = ::fidl::HLCPPToNatural(std::move(*value.mutable_some_field()));
        }
      return natural;
    }
    ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayTableErr_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResponse>::Convert(::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayTableErr_Response hlcpp;
        if (value.some_field().has_value()) {
          hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
        }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayTableErr_Response>::Convert(::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayTableErr_Response&& value) {
      ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResponse natural;
        if (value.has_some_field()) {
          natural.some_field() = ::fidl::HLCPPToNatural(std::move(*value.mutable_some_field()));
        }
      return natural;
    }
    ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableResponse NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableResponse>::Convert(::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableResponse hlcpp;
        if (value.some_field().has_value()) {
          hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
        }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableResponse>::Convert(::test::unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableResponse&& value) {
      ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableResponse natural;
        if (value.has_some_field()) {
          natural.some_field() = ::fidl::HLCPPToNatural(std::move(*value.mutable_some_field()));
        }
      return natural;
    }
    ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayTableErr_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResponse>::Convert(::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayTableErr_Response hlcpp;
        if (value.some_field().has_value()) {
          hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
        }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayTableErr_Response>::Convert(::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayTableErr_Response&& value) {
      ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResponse natural;
        if (value.has_some_field()) {
          natural.some_field() = ::fidl::HLCPPToNatural(std::move(*value.mutable_some_field()));
        }
      return natural;
    }

  
    ::test::unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionResponse NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionResponse>::Convert(::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionResponse hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionResponse::Tag::kSomeField:
            hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionResponse>::Convert(::test::unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionResponse&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionResponse;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionResponse::Tag::kSomeField:
            return _NaturalUnion::WithSomeField(
                  ::fidl::HLCPPToNatural(std::move(value.some_field())));
          default:
            return _NaturalUnion(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
      }
    }
    ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayErr_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayErrResult>::Convert(::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayErrResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayErr_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayErrResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayErrResult::Tag::kErr:
            hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayErrResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayErr_Result>::Convert(::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayErr_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayErrResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayErr_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayErr_Result::Tag::kErr:
            return _NaturalUnion::WithErr(
                  ::fidl::HLCPPToNatural(std::move(value.err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayErr_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayFieldsErr_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResult>::Convert(::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayFieldsErr_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResult::Tag::kErr:
            hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayFieldsErr_Result>::Convert(::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayFieldsErr_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayFieldsErrResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayFieldsErr_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayFieldsErr_Result::Tag::kErr:
            return _NaturalUnion::WithErr(
                  ::fidl::HLCPPToNatural(std::move(value.err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayFieldsErr_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayUnionErr_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResponse>::Convert(::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayUnionErr_Response hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResponse::Tag::kSomeField:
            hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayUnionErr_Response>::Convert(::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayUnionErr_Response&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResponse;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayUnionErr_Response::Tag::kSomeField:
            return _NaturalUnion::WithSomeField(
                  ::fidl::HLCPPToNatural(std::move(value.some_field())));
          default:
            return _NaturalUnion(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
      }
    }
    ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayUnionErr_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResult>::Convert(::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayUnionErr_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResult::Tag::kErr:
            hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayUnionErr_Result>::Convert(::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayUnionErr_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayUnionErrResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayUnionErr_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayUnionErr_Result::Tag::kErr:
            return _NaturalUnion::WithErr(
                  ::fidl::HLCPPToNatural(std::move(value.err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayUnionErr_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayTableErr_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResult>::Convert(::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayTableErr_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResult::Tag::kErr:
            hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayTableErr_Result>::Convert(::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayTableErr_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsProtocolStrictTwoWayTableErrResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayTableErr_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayTableErr_Result::Tag::kErr:
            return _NaturalUnion::WithErr(
                  ::fidl::HLCPPToNatural(std::move(value.err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsProtocol_StrictTwoWayTableErr_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWay_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayResult>::Convert(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWay_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayResult::Tag::kFrameworkErr:
            hlcpp.set_framework_err(::fidl::NaturalToHLCPP(std::move(value.framework_err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWay_Result>::Convert(::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWay_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWay_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWay_Result::Tag::kFrameworkErr:
            return _NaturalUnion::WithFrameworkErr(
                  ::fidl::HLCPPToNatural(std::move(value.framework_err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWay_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFields_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsResult>::Convert(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFields_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsResult::Tag::kFrameworkErr:
            hlcpp.set_framework_err(::fidl::NaturalToHLCPP(std::move(value.framework_err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFields_Result>::Convert(::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFields_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFields_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFields_Result::Tag::kFrameworkErr:
            return _NaturalUnion::WithFrameworkErr(
                  ::fidl::HLCPPToNatural(std::move(value.framework_err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFields_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnion_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResponse>::Convert(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnion_Response hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResponse::Tag::kSomeField:
            hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnion_Response>::Convert(::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnion_Response&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResponse;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnion_Response::Tag::kSomeField:
            return _NaturalUnion::WithSomeField(
                  ::fidl::HLCPPToNatural(std::move(value.some_field())));
          default:
            return _NaturalUnion(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
      }
    }
    ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnion_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResult>::Convert(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnion_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResult::Tag::kFrameworkErr:
            hlcpp.set_framework_err(::fidl::NaturalToHLCPP(std::move(value.framework_err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnion_Result>::Convert(::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnion_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnion_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnion_Result::Tag::kFrameworkErr:
            return _NaturalUnion::WithFrameworkErr(
                  ::fidl::HLCPPToNatural(std::move(value.framework_err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnion_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTable_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableResult>::Convert(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTable_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableResult::Tag::kFrameworkErr:
            hlcpp.set_framework_err(::fidl::NaturalToHLCPP(std::move(value.framework_err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTable_Result>::Convert(::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTable_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTable_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTable_Result::Tag::kFrameworkErr:
            return _NaturalUnion::WithFrameworkErr(
                  ::fidl::HLCPPToNatural(std::move(value.framework_err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTable_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayErr_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResult>::Convert(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayErr_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResult::Tag::kErr:
            hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResult::Tag::kFrameworkErr:
            hlcpp.set_framework_err(::fidl::NaturalToHLCPP(std::move(value.framework_err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayErr_Result>::Convert(::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayErr_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayErrResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayErr_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayErr_Result::Tag::kErr:
            return _NaturalUnion::WithErr(
                  ::fidl::HLCPPToNatural(std::move(value.err())));
          case ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayErr_Result::Tag::kFrameworkErr:
            return _NaturalUnion::WithFrameworkErr(
                  ::fidl::HLCPPToNatural(std::move(value.framework_err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayErr_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFieldsErr_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResult>::Convert(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFieldsErr_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResult::Tag::kErr:
            hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResult::Tag::kFrameworkErr:
            hlcpp.set_framework_err(::fidl::NaturalToHLCPP(std::move(value.framework_err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFieldsErr_Result>::Convert(::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFieldsErr_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayFieldsErrResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFieldsErr_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFieldsErr_Result::Tag::kErr:
            return _NaturalUnion::WithErr(
                  ::fidl::HLCPPToNatural(std::move(value.err())));
          case ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFieldsErr_Result::Tag::kFrameworkErr:
            return _NaturalUnion::WithFrameworkErr(
                  ::fidl::HLCPPToNatural(std::move(value.framework_err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayFieldsErr_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnionErr_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResponse>::Convert(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnionErr_Response hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResponse::Tag::kSomeField:
            hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnionErr_Response>::Convert(::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnionErr_Response&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResponse;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnionErr_Response::Tag::kSomeField:
            return _NaturalUnion::WithSomeField(
                  ::fidl::HLCPPToNatural(std::move(value.some_field())));
          default:
            return _NaturalUnion(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
      }
    }
    ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnionErr_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResult>::Convert(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnionErr_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResult::Tag::kErr:
            hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResult::Tag::kFrameworkErr:
            hlcpp.set_framework_err(::fidl::NaturalToHLCPP(std::move(value.framework_err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnionErr_Result>::Convert(::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnionErr_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayUnionErrResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnionErr_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnionErr_Result::Tag::kErr:
            return _NaturalUnion::WithErr(
                  ::fidl::HLCPPToNatural(std::move(value.err())));
          case ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnionErr_Result::Tag::kFrameworkErr:
            return _NaturalUnion::WithFrameworkErr(
                  ::fidl::HLCPPToNatural(std::move(value.framework_err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayUnionErr_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTableErr_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResult>::Convert(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTableErr_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResult::Tag::kErr:
            hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResult::Tag::kFrameworkErr:
            hlcpp.set_framework_err(::fidl::NaturalToHLCPP(std::move(value.framework_err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTableErr_Result>::Convert(::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTableErr_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleTwoWayTableErrResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTableErr_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTableErr_Result::Tag::kErr:
            return _NaturalUnion::WithErr(
                  ::fidl::HLCPPToNatural(std::move(value.err())));
          case ::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTableErr_Result::Tag::kFrameworkErr:
            return _NaturalUnion::WithFrameworkErr(
                  ::fidl::HLCPPToNatural(std::move(value.framework_err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsProtocol_FlexibleTwoWayTableErr_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsProtocolStrictEventUnionRequest NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolStrictEventUnionRequest>::Convert(::test_unknowninteractions::UnknownInteractionsProtocolStrictEventUnionRequest&& value) {
      ::test::unknowninteractions::UnknownInteractionsProtocolStrictEventUnionRequest hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsProtocolStrictEventUnionRequest::Tag::kSomeField:
            hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsProtocolStrictEventUnionRequest HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocolStrictEventUnionRequest>::Convert(::test::unknowninteractions::UnknownInteractionsProtocolStrictEventUnionRequest&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsProtocolStrictEventUnionRequest;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsProtocolStrictEventUnionRequest::Tag::kSomeField:
            return _NaturalUnion::WithSomeField(
                  ::fidl::HLCPPToNatural(std::move(value.some_field())));
          default:
            return _NaturalUnion(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
      }
    }
    ::test::unknowninteractions::UnknownInteractionsProtocolFlexibleEventUnionRequest NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventUnionRequest>::Convert(::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventUnionRequest&& value) {
      ::test::unknowninteractions::UnknownInteractionsProtocolFlexibleEventUnionRequest hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventUnionRequest::Tag::kSomeField:
            hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventUnionRequest HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsProtocolFlexibleEventUnionRequest>::Convert(::test::unknowninteractions::UnknownInteractionsProtocolFlexibleEventUnionRequest&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsProtocolFlexibleEventUnionRequest;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsProtocolFlexibleEventUnionRequest::Tag::kSomeField:
            return _NaturalUnion::WithSomeField(
                  ::fidl::HLCPPToNatural(std::move(value.some_field())));
          default:
            return _NaturalUnion(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
      }
    }
    ::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionResponse NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionResponse>::Convert(::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionResponse hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionResponse::Tag::kSomeField:
            hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionResponse>::Convert(::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionResponse&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionResponse;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionResponse::Tag::kSomeField:
            return _NaturalUnion::WithSomeField(
                  ::fidl::HLCPPToNatural(std::move(value.some_field())));
          default:
            return _NaturalUnion(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
      }
    }
    ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayErr_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayErrResult>::Convert(::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayErrResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayErr_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayErrResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayErrResult::Tag::kErr:
            hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayErrResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayErr_Result>::Convert(::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayErr_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayErrResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayErr_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayErr_Result::Tag::kErr:
            return _NaturalUnion::WithErr(
                  ::fidl::HLCPPToNatural(std::move(value.err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayErr_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayFieldsErr_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResult>::Convert(::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayFieldsErr_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResult::Tag::kErr:
            hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayFieldsErr_Result>::Convert(::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayFieldsErr_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayFieldsErrResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayFieldsErr_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayFieldsErr_Result::Tag::kErr:
            return _NaturalUnion::WithErr(
                  ::fidl::HLCPPToNatural(std::move(value.err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayFieldsErr_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayUnionErr_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResponse>::Convert(::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayUnionErr_Response hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResponse::Tag::kSomeField:
            hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayUnionErr_Response>::Convert(::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayUnionErr_Response&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResponse;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayUnionErr_Response::Tag::kSomeField:
            return _NaturalUnion::WithSomeField(
                  ::fidl::HLCPPToNatural(std::move(value.some_field())));
          default:
            return _NaturalUnion(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
      }
    }
    ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayUnionErr_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResult>::Convert(::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayUnionErr_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResult::Tag::kErr:
            hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayUnionErr_Result>::Convert(::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayUnionErr_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayUnionErrResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayUnionErr_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayUnionErr_Result::Tag::kErr:
            return _NaturalUnion::WithErr(
                  ::fidl::HLCPPToNatural(std::move(value.err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayUnionErr_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayTableErr_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResult>::Convert(::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayTableErr_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResult::Tag::kErr:
            hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayTableErr_Result>::Convert(::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayTableErr_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictTwoWayTableErrResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayTableErr_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayTableErr_Result::Tag::kErr:
            return _NaturalUnion::WithErr(
                  ::fidl::HLCPPToNatural(std::move(value.err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsAjarProtocol_StrictTwoWayTableErr_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictEventUnionRequest NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventUnionRequest>::Convert(::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventUnionRequest&& value) {
      ::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictEventUnionRequest hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventUnionRequest::Tag::kSomeField:
            hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventUnionRequest HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictEventUnionRequest>::Convert(::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictEventUnionRequest&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsAjarProtocolStrictEventUnionRequest;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsAjarProtocolStrictEventUnionRequest::Tag::kSomeField:
            return _NaturalUnion::WithSomeField(
                  ::fidl::HLCPPToNatural(std::move(value.some_field())));
          default:
            return _NaturalUnion(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
      }
    }
    ::test::unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventUnionRequest NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventUnionRequest>::Convert(::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventUnionRequest&& value) {
      ::test::unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventUnionRequest hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventUnionRequest::Tag::kSomeField:
            hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventUnionRequest HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventUnionRequest>::Convert(::test::unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventUnionRequest&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventUnionRequest;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsAjarProtocolFlexibleEventUnionRequest::Tag::kSomeField:
            return _NaturalUnion::WithSomeField(
                  ::fidl::HLCPPToNatural(std::move(value.some_field())));
          default:
            return _NaturalUnion(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
      }
    }
    ::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionResponse NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionResponse>::Convert(::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionResponse hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionResponse::Tag::kSomeField:
            hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionResponse>::Convert(::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionResponse&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionResponse;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionResponse::Tag::kSomeField:
            return _NaturalUnion::WithSomeField(
                  ::fidl::HLCPPToNatural(std::move(value.some_field())));
          default:
            return _NaturalUnion(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
      }
    }
    ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayErr_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayErrResult>::Convert(::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayErrResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayErr_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayErrResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayErrResult::Tag::kErr:
            hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayErrResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayErr_Result>::Convert(::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayErr_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayErrResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayErr_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayErr_Result::Tag::kErr:
            return _NaturalUnion::WithErr(
                  ::fidl::HLCPPToNatural(std::move(value.err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayErr_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayFieldsErr_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResult>::Convert(::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayFieldsErr_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResult::Tag::kErr:
            hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayFieldsErr_Result>::Convert(::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayFieldsErr_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayFieldsErrResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayFieldsErr_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayFieldsErr_Result::Tag::kErr:
            return _NaturalUnion::WithErr(
                  ::fidl::HLCPPToNatural(std::move(value.err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayFieldsErr_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayUnionErr_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResponse>::Convert(::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayUnionErr_Response hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResponse::Tag::kSomeField:
            hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayUnionErr_Response>::Convert(::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayUnionErr_Response&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResponse;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayUnionErr_Response::Tag::kSomeField:
            return _NaturalUnion::WithSomeField(
                  ::fidl::HLCPPToNatural(std::move(value.some_field())));
          default:
            return _NaturalUnion(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
      }
    }
    ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayUnionErr_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResult>::Convert(::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayUnionErr_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResult::Tag::kErr:
            hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayUnionErr_Result>::Convert(::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayUnionErr_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayUnionErrResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayUnionErr_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayUnionErr_Result::Tag::kErr:
            return _NaturalUnion::WithErr(
                  ::fidl::HLCPPToNatural(std::move(value.err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayUnionErr_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayTableErr_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResult>::Convert(::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayTableErr_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResult::Tag::kErr:
            hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayTableErr_Result>::Convert(::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayTableErr_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictTwoWayTableErrResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayTableErr_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayTableErr_Result::Tag::kErr:
            return _NaturalUnion::WithErr(
                  ::fidl::HLCPPToNatural(std::move(value.err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsClosedProtocol_StrictTwoWayTableErr_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictEventUnionRequest NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventUnionRequest>::Convert(::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventUnionRequest&& value) {
      ::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictEventUnionRequest hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventUnionRequest::Tag::kSomeField:
            hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventUnionRequest HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictEventUnionRequest>::Convert(::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictEventUnionRequest&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsClosedProtocolStrictEventUnionRequest;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsClosedProtocolStrictEventUnionRequest::Tag::kSomeField:
            return _NaturalUnion::WithSomeField(
                  ::fidl::HLCPPToNatural(std::move(value.some_field())));
          default:
            return _NaturalUnion(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
      }
    }
    ::test::unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionResponse NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionResponse>::Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionResponse hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionResponse::Tag::kSomeField:
            hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionResponse>::Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionResponse&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionResponse;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionResponse::Tag::kSomeField:
            return _NaturalUnion::WithSomeField(
                  ::fidl::HLCPPToNatural(std::move(value.some_field())));
          default:
            return _NaturalUnion(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
      }
    }
    ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayErr_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayErrResult>::Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayErrResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayErr_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayErrResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayErrResult::Tag::kErr:
            hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayErrResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayErr_Result>::Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayErr_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayErrResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayErr_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayErr_Result::Tag::kErr:
            return _NaturalUnion::WithErr(
                  ::fidl::HLCPPToNatural(std::move(value.err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayErr_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayFieldsErr_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResult>::Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayFieldsErr_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResult::Tag::kErr:
            hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayFieldsErr_Result>::Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayFieldsErr_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayFieldsErrResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayFieldsErr_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayFieldsErr_Result::Tag::kErr:
            return _NaturalUnion::WithErr(
                  ::fidl::HLCPPToNatural(std::move(value.err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayFieldsErr_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayUnionErr_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResponse>::Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayUnionErr_Response hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResponse::Tag::kSomeField:
            hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayUnionErr_Response>::Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayUnionErr_Response&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResponse;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayUnionErr_Response::Tag::kSomeField:
            return _NaturalUnion::WithSomeField(
                  ::fidl::HLCPPToNatural(std::move(value.some_field())));
          default:
            return _NaturalUnion(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
      }
    }
    ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayUnionErr_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResult>::Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayUnionErr_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResult::Tag::kErr:
            hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayUnionErr_Result>::Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayUnionErr_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayUnionErrResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayUnionErr_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayUnionErr_Result::Tag::kErr:
            return _NaturalUnion::WithErr(
                  ::fidl::HLCPPToNatural(std::move(value.err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayUnionErr_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayTableErr_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResult>::Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayTableErr_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResult::Tag::kErr:
            hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayTableErr_Result>::Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayTableErr_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsDriverProtocolStrictTwoWayTableErrResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayTableErr_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayTableErr_Result::Tag::kErr:
            return _NaturalUnion::WithErr(
                  ::fidl::HLCPPToNatural(std::move(value.err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsDriverProtocol_StrictTwoWayTableErr_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWay_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayResult>::Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWay_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayResult::Tag::kFrameworkErr:
            hlcpp.set_framework_err(::fidl::NaturalToHLCPP(std::move(value.framework_err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWay_Result>::Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWay_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWay_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWay_Result::Tag::kFrameworkErr:
            return _NaturalUnion::WithFrameworkErr(
                  ::fidl::HLCPPToNatural(std::move(value.framework_err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWay_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFields_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResult>::Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFields_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResult::Tag::kFrameworkErr:
            hlcpp.set_framework_err(::fidl::NaturalToHLCPP(std::move(value.framework_err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFields_Result>::Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFields_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFields_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFields_Result::Tag::kFrameworkErr:
            return _NaturalUnion::WithFrameworkErr(
                  ::fidl::HLCPPToNatural(std::move(value.framework_err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFields_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnion_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResponse>::Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnion_Response hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResponse::Tag::kSomeField:
            hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnion_Response>::Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnion_Response&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResponse;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnion_Response::Tag::kSomeField:
            return _NaturalUnion::WithSomeField(
                  ::fidl::HLCPPToNatural(std::move(value.some_field())));
          default:
            return _NaturalUnion(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
      }
    }
    ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnion_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResult>::Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnion_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResult::Tag::kFrameworkErr:
            hlcpp.set_framework_err(::fidl::NaturalToHLCPP(std::move(value.framework_err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnion_Result>::Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnion_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnion_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnion_Result::Tag::kFrameworkErr:
            return _NaturalUnion::WithFrameworkErr(
                  ::fidl::HLCPPToNatural(std::move(value.framework_err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnion_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTable_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResult>::Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTable_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResult::Tag::kFrameworkErr:
            hlcpp.set_framework_err(::fidl::NaturalToHLCPP(std::move(value.framework_err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTable_Result>::Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTable_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTable_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTable_Result::Tag::kFrameworkErr:
            return _NaturalUnion::WithFrameworkErr(
                  ::fidl::HLCPPToNatural(std::move(value.framework_err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTable_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayErr_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResult>::Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayErr_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResult::Tag::kErr:
            hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResult::Tag::kFrameworkErr:
            hlcpp.set_framework_err(::fidl::NaturalToHLCPP(std::move(value.framework_err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayErr_Result>::Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayErr_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayErrResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayErr_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayErr_Result::Tag::kErr:
            return _NaturalUnion::WithErr(
                  ::fidl::HLCPPToNatural(std::move(value.err())));
          case ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayErr_Result::Tag::kFrameworkErr:
            return _NaturalUnion::WithFrameworkErr(
                  ::fidl::HLCPPToNatural(std::move(value.framework_err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayErr_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFieldsErr_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResult>::Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFieldsErr_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResult::Tag::kErr:
            hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResult::Tag::kFrameworkErr:
            hlcpp.set_framework_err(::fidl::NaturalToHLCPP(std::move(value.framework_err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFieldsErr_Result>::Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFieldsErr_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayFieldsErrResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFieldsErr_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFieldsErr_Result::Tag::kErr:
            return _NaturalUnion::WithErr(
                  ::fidl::HLCPPToNatural(std::move(value.err())));
          case ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFieldsErr_Result::Tag::kFrameworkErr:
            return _NaturalUnion::WithFrameworkErr(
                  ::fidl::HLCPPToNatural(std::move(value.framework_err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayFieldsErr_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnionErr_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResponse>::Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnionErr_Response hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResponse::Tag::kSomeField:
            hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnionErr_Response>::Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnionErr_Response&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResponse;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnionErr_Response::Tag::kSomeField:
            return _NaturalUnion::WithSomeField(
                  ::fidl::HLCPPToNatural(std::move(value.some_field())));
          default:
            return _NaturalUnion(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
      }
    }
    ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnionErr_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResult>::Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnionErr_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResult::Tag::kErr:
            hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResult::Tag::kFrameworkErr:
            hlcpp.set_framework_err(::fidl::NaturalToHLCPP(std::move(value.framework_err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnionErr_Result>::Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnionErr_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayUnionErrResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnionErr_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnionErr_Result::Tag::kErr:
            return _NaturalUnion::WithErr(
                  ::fidl::HLCPPToNatural(std::move(value.err())));
          case ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnionErr_Result::Tag::kFrameworkErr:
            return _NaturalUnion::WithFrameworkErr(
                  ::fidl::HLCPPToNatural(std::move(value.framework_err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayUnionErr_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTableErr_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResult>::Convert(::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTableErr_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResult::Tag::kErr:
            hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResult::Tag::kFrameworkErr:
            hlcpp.set_framework_err(::fidl::NaturalToHLCPP(std::move(value.framework_err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTableErr_Result>::Convert(::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTableErr_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsDriverProtocolFlexibleTwoWayTableErrResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTableErr_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTableErr_Result::Tag::kErr:
            return _NaturalUnion::WithErr(
                  ::fidl::HLCPPToNatural(std::move(value.err())));
          case ::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTableErr_Result::Tag::kFrameworkErr:
            return _NaturalUnion::WithFrameworkErr(
                  ::fidl::HLCPPToNatural(std::move(value.framework_err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsDriverProtocol_FlexibleTwoWayTableErr_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionResponse NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionResponse>::Convert(::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionResponse hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionResponse::Tag::kSomeField:
            hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionResponse>::Convert(::test::unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionResponse&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionResponse;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionResponse::Tag::kSomeField:
            return _NaturalUnion::WithSomeField(
                  ::fidl::HLCPPToNatural(std::move(value.some_field())));
          default:
            return _NaturalUnion(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
      }
    }
    ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayErr_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResult>::Convert(::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayErr_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResult::Tag::kErr:
            hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayErr_Result>::Convert(::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayErr_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayErrResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayErr_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayErr_Result::Tag::kErr:
            return _NaturalUnion::WithErr(
                  ::fidl::HLCPPToNatural(std::move(value.err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayErr_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayFieldsErr_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResult>::Convert(::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayFieldsErr_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResult::Tag::kErr:
            hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayFieldsErr_Result>::Convert(::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayFieldsErr_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayFieldsErrResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayFieldsErr_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayFieldsErr_Result::Tag::kErr:
            return _NaturalUnion::WithErr(
                  ::fidl::HLCPPToNatural(std::move(value.err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayFieldsErr_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayUnionErr_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResponse>::Convert(::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayUnionErr_Response hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResponse::Tag::kSomeField:
            hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayUnionErr_Response>::Convert(::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayUnionErr_Response&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResponse;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayUnionErr_Response::Tag::kSomeField:
            return _NaturalUnion::WithSomeField(
                  ::fidl::HLCPPToNatural(std::move(value.some_field())));
          default:
            return _NaturalUnion(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
      }
    }
    ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayUnionErr_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResult>::Convert(::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayUnionErr_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResult::Tag::kErr:
            hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayUnionErr_Result>::Convert(::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayUnionErr_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayUnionErrResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayUnionErr_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayUnionErr_Result::Tag::kErr:
            return _NaturalUnion::WithErr(
                  ::fidl::HLCPPToNatural(std::move(value.err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayUnionErr_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayTableErr_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResult>::Convert(::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayTableErr_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResult::Tag::kErr:
            hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayTableErr_Result>::Convert(::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayTableErr_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsAjarDriverProtocolStrictTwoWayTableErrResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayTableErr_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayTableErr_Result::Tag::kErr:
            return _NaturalUnion::WithErr(
                  ::fidl::HLCPPToNatural(std::move(value.err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsAjarDriverProtocol_StrictTwoWayTableErr_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionResponse NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionResponse>::Convert(::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionResponse hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionResponse::Tag::kSomeField:
            hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionResponse>::Convert(::test::unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionResponse&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionResponse;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionResponse::Tag::kSomeField:
            return _NaturalUnion::WithSomeField(
                  ::fidl::HLCPPToNatural(std::move(value.some_field())));
          default:
            return _NaturalUnion(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
      }
    }
    ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayErr_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResult>::Convert(::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayErr_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResult::Tag::kErr:
            hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayErr_Result>::Convert(::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayErr_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayErrResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayErr_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayErr_Result::Tag::kErr:
            return _NaturalUnion::WithErr(
                  ::fidl::HLCPPToNatural(std::move(value.err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayErr_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayFieldsErr_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResult>::Convert(::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayFieldsErr_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResult::Tag::kErr:
            hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayFieldsErr_Result>::Convert(::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayFieldsErr_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayFieldsErrResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayFieldsErr_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayFieldsErr_Result::Tag::kErr:
            return _NaturalUnion::WithErr(
                  ::fidl::HLCPPToNatural(std::move(value.err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayFieldsErr_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayUnionErr_Response NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResponse>::Convert(::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResponse&& value) {
      ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayUnionErr_Response hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResponse::Tag::kSomeField:
            hlcpp.set_some_field(::fidl::NaturalToHLCPP(std::move(value.some_field().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResponse HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayUnionErr_Response>::Convert(::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayUnionErr_Response&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResponse;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayUnionErr_Response::Tag::kSomeField:
            return _NaturalUnion::WithSomeField(
                  ::fidl::HLCPPToNatural(std::move(value.some_field())));
          default:
            return _NaturalUnion(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
      }
    }
    ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayUnionErr_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResult>::Convert(::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayUnionErr_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResult::Tag::kErr:
            hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayUnionErr_Result>::Convert(::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayUnionErr_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayUnionErrResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayUnionErr_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayUnionErr_Result::Tag::kErr:
            return _NaturalUnion::WithErr(
                  ::fidl::HLCPPToNatural(std::move(value.err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayUnionErr_Result");
      }
    }
    ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayTableErr_Result NaturalToHLCPPTraits<::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResult>::Convert(::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResult&& value) {
      ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayTableErr_Result hlcpp;
      switch (value.Which()) {
          case ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResult::Tag::kResponse:
            hlcpp.set_response(::fidl::NaturalToHLCPP(std::move(value.response().value())));
            break;
          case ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResult::Tag::kErr:
            hlcpp.set_err(::fidl::NaturalToHLCPP(std::move(value.err().value())));
            break;
        default:
          break;
      }
      return hlcpp;
    }

    ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResult HLCPPToNaturalTraits<::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayTableErr_Result>::Convert(::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayTableErr_Result&& value) {
      using _NaturalUnion = ::test_unknowninteractions::UnknownInteractionsClosedDriverProtocolStrictTwoWayTableErrResult;
      switch (value.Which()) {
          case ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayTableErr_Result::Tag::kResponse:
            return _NaturalUnion::WithResponse(
                  ::fidl::HLCPPToNatural(std::move(value.response())));
          case ::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayTableErr_Result::Tag::kErr:
            return _NaturalUnion::WithErr(
                  ::fidl::HLCPPToNatural(std::move(value.err())));
          default:
            ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unknowninteractions::UnknownInteractionsClosedDriverProtocol_StrictTwoWayTableErr_Result");
      }
    }

  #pragma clang diagnostic pop

  }  // namespace internal
}  // namespace fidl

