// clang-format off
/*
 *  Catch v2.13.7
 *  Generated: 2021-07-28 20:29:27.753164
 *  ----------------------------------------------------------
 *  This file has been merged from multiple headers. Please don't edit it
 * directly Copyright (c) 2021 Two Blue Cubes Ltd. All rights reserved.
 *
 *  Distributed under the Boost Software License, Version 1.0. (See accompanying
 *  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 */
#ifndef TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED
#define TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED
// start catch.hpp

#define CATCH_VERSION_MAJOR 2
#define CATCH_VERSION_MINOR 13
#define CATCH_VERSION_PATCH 7

#ifdef __clang__
#pragma clang system_header
#elif defined __GNUC__
#pragma GCC system_header
#endif

// start catch_suppress_warnings.h

#ifdef __clang__
#ifdef __ICC // icpc defines the __clang__ macro
#pragma warning(push)
#pragma warning(disable : 161 1682)
#else // __ICC
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wpadded"
#pragma clang diagnostic ignored "-Wswitch-enum"
#pragma clang diagnostic ignored "-Wcovered-switch-default"
#endif
#elif defined __GNUC__
// Because REQUIREs trigger GCC's -Wparentheses, and because still
// supported version of g++ have only buggy support for _Pragmas,
// Wparentheses have to be suppressed globally.
#pragma GCC diagnostic ignored "-Wparentheses" // See #674 for details

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-variable"
#pragma GCC diagnostic ignored "-Wpadded"
#endif
// end catch_suppress_warnings.h
#if defined(CATCH_CONFIG_MAIN) || defined(CATCH_CONFIG_RUNNER)
#define CATCH_IMPL
#define CATCH_CONFIG_ALL_PARTS
#endif

// In the impl file, we want to have access to all parts of the headers
// Can also be used to sanely support PCHs
#if defined(CATCH_CONFIG_ALL_PARTS)
#define CATCH_CONFIG_EXTERNAL_INTERFACES
#if defined(CATCH_CONFIG_DISABLE_MATCHERS)
#undef CATCH_CONFIG_DISABLE_MATCHERS
#endif
#if !defined(CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER)
#define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER
#endif
#endif

#if !defined(CATCH_CONFIG_IMPL_ONLY)
// start catch_platform.h

// See e.g.:
// https://opensource.apple.com/source/CarbonHeaders/CarbonHeaders-18.1/TargetConditionals.h.auto.html
#ifdef __APPLE__
#include <TargetConditionals.h>
#if (defined(TARGET_OS_OSX) && TARGET_OS_OSX == 1) || (defined(TARGET_OS_MAC) && TARGET_OS_MAC == 1)
#define CATCH_PLATFORM_MAC
#elif (defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE == 1)
#define CATCH_PLATFORM_IPHONE
#endif

#elif defined(linux) || defined(__linux) || defined(__linux__)
#define CATCH_PLATFORM_LINUX

#elif defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) ||              \
    defined(__MINGW32__)
#define CATCH_PLATFORM_WINDOWS
#endif

// end catch_platform.h

#ifdef CATCH_IMPL
#ifndef CLARA_CONFIG_MAIN
#define CLARA_CONFIG_MAIN_NOT_DEFINED
#define CLARA_CONFIG_MAIN
#endif
#endif

// start catch_user_interfaces.h

namespace Catch {
    unsigned int rngSeed();
}

// end catch_user_interfaces.h
// start catch_tag_alias_autoregistrar.h

// start catch_common.h

// start catch_compiler_capabilities.h

// Detect a number of compiler features - by compiler
// The following features are defined:
//
// CATCH_CONFIG_COUNTER : is the __COUNTER__ macro supported?
// CATCH_CONFIG_WINDOWS_SEH : is Windows SEH supported?
// CATCH_CONFIG_POSIX_SIGNALS : are POSIX signals supported?
// CATCH_CONFIG_DISABLE_EXCEPTIONS : Are exceptions enabled?
// ****************
// Note to maintainers: if new toggles are added please document them
// in configuration.md, too
// ****************

// In general each macro has a _NO_<feature name> form
// (e.g. CATCH_CONFIG_NO_POSIX_SIGNALS) which disables the feature.
// Many features, at point of detection, define an _INTERNAL_ macro, so they
// can be combined, en-mass, with the _NO_ forms later.

#ifdef __cplusplus

#if (__cplusplus >= 201402L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201402L)
#define CATCH_CPP14_OR_GREATER
#endif

#if (__cplusplus >= 201703L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)
#define CATCH_CPP17_OR_GREATER
#endif

#endif

// Only GCC compiler should be used in this block, so other compilers trying to
// mask themselves as GCC should be ignored.
#if defined(__GNUC__) && !defined(__clang__) && !defined(__ICC) && !defined(__CUDACC__) &&         \
    !defined(__LCC__)
#define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma("GCC diagnostic push")
#define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION _Pragma("GCC diagnostic pop")

#define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__)

#endif

#if defined(__clang__)

#define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma("clang diagnostic push")
#define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION _Pragma("clang diagnostic pop")

// As of this writing, IBM XL's implementation of __builtin_constant_p has a bug
// which results in calls to destructors being emitted for each temporary,
// without a matching initialization. In practice, this can result in something
// like `std::string::~string` being called on an uninitialized value.
//
// For example, this code will likely segfault under IBM XL:
// ```
// REQUIRE(std::string("12") + "34" == "1234")
// ```
//
// Therefore, `CATCH_INTERNAL_IGNORE_BUT_WARN` is not implemented.
#if !defined(__ibmxl__) && !defined(__CUDACC__)
#define CATCH_INTERNAL_IGNORE_BUT_WARN(...)                                                        \
    (void)__builtin_constant_p(__VA_ARGS__) /* NOLINT(cppcoreguidelines-pro-type-vararg,           \
                                               hicpp-vararg) */
#endif

#define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS                                                   \
    _Pragma("clang diagnostic ignored \"-Wexit-time-destructors\"")                                \
        _Pragma("clang diagnostic ignored \"-Wglobal-constructors\"")

#define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS                                               \
    _Pragma("clang diagnostic ignored \"-Wparentheses\"")

#define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS                                                    \
    _Pragma("clang diagnostic ignored \"-Wunused-variable\"")

#define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS                                             \
    _Pragma("clang diagnostic ignored "                                                            \
            "\"-Wgnu-zero-variadic-macro-arguments\"")

#define CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS                                           \
    _Pragma("clang diagnostic ignored \"-Wunused-template\"")

#endif // __clang__

////////////////////////////////////////////////////////////////////////////////
// Assume that non-Windows platforms support posix signals by default
#if !defined(CATCH_PLATFORM_WINDOWS)
#define CATCH_INTERNAL_CONFIG_POSIX_SIGNALS
#endif

////////////////////////////////////////////////////////////////////////////////
// We know some environments not to support full POSIX signals
#if defined(__CYGWIN__) || defined(__QNX__) || defined(__EMSCRIPTEN__) || defined(__DJGPP__)
#define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS
#endif

#ifdef __OS400__
#define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS
#define CATCH_CONFIG_COLOUR_NONE
#endif

////////////////////////////////////////////////////////////////////////////////
// Android somehow still does not support std::to_string
#if defined(__ANDROID__)
#define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING
#define CATCH_INTERNAL_CONFIG_ANDROID_LOGWRITE
#endif

////////////////////////////////////////////////////////////////////////////////
// Not all Windows environments support SEH properly
#if defined(__MINGW32__)
#define CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH
#endif

////////////////////////////////////////////////////////////////////////////////
// PS4
#if defined(__ORBIS__)
#define CATCH_INTERNAL_CONFIG_NO_NEW_CAPTURE
#endif

////////////////////////////////////////////////////////////////////////////////
// Cygwin
#ifdef __CYGWIN__

// Required for some versions of Cygwin to declare gettimeofday
// see:
// http://stackoverflow.com/questions/36901803/gettimeofday-not-declared-in-this-scope-cygwin
#define _BSD_SOURCE
// some versions of cygwin (most) do not support std::to_string. Use the libstd
// check.
// https://gcc.gnu.org/onlinedocs/gcc-4.8.2/libstdc++/api/a01053_source.html
// line 2812-2813
#if !((__cplusplus >= 201103L) && defined(_GLIBCXX_USE_C99) &&                                     \
      !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF))

#define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING

#endif
#endif // __CYGWIN__

////////////////////////////////////////////////////////////////////////////////
// Visual C++
#if defined(_MSC_VER)

#define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION __pragma(warning(push))
#define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION __pragma(warning(pop))

// Universal Windows platform does not support SEH
// Or console colours (or console at all...)
#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP)
#define CATCH_CONFIG_COLOUR_NONE
#else
#define CATCH_INTERNAL_CONFIG_WINDOWS_SEH
#endif

// MSVC traditional preprocessor needs some workaround for __VA_ARGS__
// _MSVC_TRADITIONAL == 0 means new conformant preprocessor
// _MSVC_TRADITIONAL == 1 means old traditional non-conformant preprocessor
#if !defined(__clang__) // Handle Clang masquerading for msvc
#if !defined(_MSVC_TRADITIONAL) || (defined(_MSVC_TRADITIONAL) && _MSVC_TRADITIONAL)
#define CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#endif // MSVC_TRADITIONAL
#endif // __clang__

#endif // _MSC_VER

#if defined(_REENTRANT) || defined(_MSC_VER)
// Enable async processing, as -pthread is specified or no additional linking is
// required
#define CATCH_INTERNAL_CONFIG_USE_ASYNC
#endif // _MSC_VER

////////////////////////////////////////////////////////////////////////////////
// Check if we are compiled with -fno-exceptions or equivalent
#if defined(__EXCEPTIONS) || defined(__cpp_exceptions) || defined(_CPPUNWIND)
#define CATCH_INTERNAL_CONFIG_EXCEPTIONS_ENABLED
#endif

////////////////////////////////////////////////////////////////////////////////
// DJGPP
#ifdef __DJGPP__
#define CATCH_INTERNAL_CONFIG_NO_WCHAR
#endif // __DJGPP__

////////////////////////////////////////////////////////////////////////////////
// Embarcadero C++Build
#if defined(__BORLANDC__)
#define CATCH_INTERNAL_CONFIG_POLYFILL_ISNAN
#endif

////////////////////////////////////////////////////////////////////////////////

// Use of __COUNTER__ is suppressed during code analysis in
// CLion/AppCode 2017.2.x and former, because __COUNTER__ is not properly
// handled by it.
// Otherwise all supported compilers support COUNTER macro,
// but user still might want to turn it off
#if (!defined(__JETBRAINS_IDE__) || __JETBRAINS_IDE__ >= 20170300L)
#define CATCH_INTERNAL_CONFIG_COUNTER
#endif

////////////////////////////////////////////////////////////////////////////////

// RTX is a special version of Windows that is real time.
// This means that it is detected as Windows, but does not provide
// the same set of capabilities as real Windows does.
#if defined(UNDER_RTSS) || defined(RTX64_BUILD)
#define CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH
#define CATCH_INTERNAL_CONFIG_NO_ASYNC
#define CATCH_CONFIG_COLOUR_NONE
#endif

#if !defined(_GLIBCXX_USE_C99_MATH_TR1)
#define CATCH_INTERNAL_CONFIG_GLOBAL_NEXTAFTER
#endif

// Various stdlib support checks that require __has_include
#if defined(__has_include)
// Check if string_view is available and usable
#if __has_include(<string_view>) && defined(CATCH_CPP17_OR_GREATER)
#define CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW
#endif

// Check if optional is available and usable
#if __has_include(<optional>) && defined(CATCH_CPP17_OR_GREATER)
#define CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL
#endif // __has_include(<optional>) && defined(CATCH_CPP17_OR_GREATER)

// Check if byte is available and usable
#if __has_include(<cstddef>) && defined(CATCH_CPP17_OR_GREATER)
#include <cstddef>
#if defined(__cpp_lib_byte) && (__cpp_lib_byte > 0)
#define CATCH_INTERNAL_CONFIG_CPP17_BYTE
#endif
#endif // __has_include(<cstddef>) && defined(CATCH_CPP17_OR_GREATER)

// Check if variant is available and usable
#if __has_include(<variant>) && defined(CATCH_CPP17_OR_GREATER)
#if defined(__clang__) && (__clang_major__ < 8)
// work around clang bug with libstdc++
// https://bugs.llvm.org/show_bug.cgi?id=31852 fix should be in clang 8,
// workaround in libstdc++ 8.2
#include <ciso646>
#if defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9)
#define CATCH_CONFIG_NO_CPP17_VARIANT
#else
#define CATCH_INTERNAL_CONFIG_CPP17_VARIANT
#endif // defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE
       // < 9)
#else
#define CATCH_INTERNAL_CONFIG_CPP17_VARIANT
#endif // defined(__clang__) && (__clang_major__ < 8)
#endif // __has_include(<variant>) && defined(CATCH_CPP17_OR_GREATER)
#endif // defined(__has_include)

#if defined(CATCH_INTERNAL_CONFIG_COUNTER) && !defined(CATCH_CONFIG_NO_COUNTER) &&                 \
    !defined(CATCH_CONFIG_COUNTER)
#define CATCH_CONFIG_COUNTER
#endif
#if defined(CATCH_INTERNAL_CONFIG_WINDOWS_SEH) && !defined(CATCH_CONFIG_NO_WINDOWS_SEH) &&         \
    !defined(CATCH_CONFIG_WINDOWS_SEH) && !defined(CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH)
#define CATCH_CONFIG_WINDOWS_SEH
#endif
// This is set by default, because we assume that unix compilers are
// posix-signal-compatible by default.
#if defined(CATCH_INTERNAL_CONFIG_POSIX_SIGNALS) &&                                                \
    !defined(CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS) && !defined(CATCH_CONFIG_NO_POSIX_SIGNALS) && \
    !defined(CATCH_CONFIG_POSIX_SIGNALS)
#define CATCH_CONFIG_POSIX_SIGNALS
#endif
// This is set by default, because we assume that compilers with no wchar_t
// support are just rare exceptions.
#if !defined(CATCH_INTERNAL_CONFIG_NO_WCHAR) && !defined(CATCH_CONFIG_NO_WCHAR) &&                 \
    !defined(CATCH_CONFIG_WCHAR)
#define CATCH_CONFIG_WCHAR
#endif

#if !defined(CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING) &&                                          \
    !defined(CATCH_CONFIG_NO_CPP11_TO_STRING) && !defined(CATCH_CONFIG_CPP11_TO_STRING)
#define CATCH_CONFIG_CPP11_TO_STRING
#endif

#if defined(CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL) && !defined(CATCH_CONFIG_NO_CPP17_OPTIONAL) &&   \
    !defined(CATCH_CONFIG_CPP17_OPTIONAL)
#define CATCH_CONFIG_CPP17_OPTIONAL
#endif

#if defined(CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW) &&                                            \
    !defined(CATCH_CONFIG_NO_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_CPP17_STRING_VIEW)
#define CATCH_CONFIG_CPP17_STRING_VIEW
#endif

#if defined(CATCH_INTERNAL_CONFIG_CPP17_VARIANT) && !defined(CATCH_CONFIG_NO_CPP17_VARIANT) &&     \
    !defined(CATCH_CONFIG_CPP17_VARIANT)
#define CATCH_CONFIG_CPP17_VARIANT
#endif

#if defined(CATCH_INTERNAL_CONFIG_CPP17_BYTE) && !defined(CATCH_CONFIG_NO_CPP17_BYTE) &&           \
    !defined(CATCH_CONFIG_CPP17_BYTE)
#define CATCH_CONFIG_CPP17_BYTE
#endif

#if defined(CATCH_CONFIG_EXPERIMENTAL_REDIRECT)
#define CATCH_INTERNAL_CONFIG_NEW_CAPTURE
#endif

#if defined(CATCH_INTERNAL_CONFIG_NEW_CAPTURE) &&                                                  \
    !defined(CATCH_INTERNAL_CONFIG_NO_NEW_CAPTURE) && !defined(CATCH_CONFIG_NO_NEW_CAPTURE) &&     \
    !defined(CATCH_CONFIG_NEW_CAPTURE)
#define CATCH_CONFIG_NEW_CAPTURE
#endif

#if !defined(CATCH_INTERNAL_CONFIG_EXCEPTIONS_ENABLED) && !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
#define CATCH_CONFIG_DISABLE_EXCEPTIONS
#endif

#if defined(CATCH_INTERNAL_CONFIG_POLYFILL_ISNAN) && !defined(CATCH_CONFIG_NO_POLYFILL_ISNAN) &&   \
    !defined(CATCH_CONFIG_POLYFILL_ISNAN)
#define CATCH_CONFIG_POLYFILL_ISNAN
#endif

#if defined(CATCH_INTERNAL_CONFIG_USE_ASYNC) && !defined(CATCH_INTERNAL_CONFIG_NO_ASYNC) &&        \
    !defined(CATCH_CONFIG_NO_USE_ASYNC) && !defined(CATCH_CONFIG_USE_ASYNC)
#define CATCH_CONFIG_USE_ASYNC
#endif

#if defined(CATCH_INTERNAL_CONFIG_ANDROID_LOGWRITE) &&                                             \
    !defined(CATCH_CONFIG_NO_ANDROID_LOGWRITE) && !defined(CATCH_CONFIG_ANDROID_LOGWRITE)
#define CATCH_CONFIG_ANDROID_LOGWRITE
#endif

#if defined(CATCH_INTERNAL_CONFIG_GLOBAL_NEXTAFTER) &&                                             \
    !defined(CATCH_CONFIG_NO_GLOBAL_NEXTAFTER) && !defined(CATCH_CONFIG_GLOBAL_NEXTAFTER)
#define CATCH_CONFIG_GLOBAL_NEXTAFTER
#endif

// Even if we do not think the compiler has that warning, we still have
// to provide a macro that can be used by the code.
#if !defined(CATCH_INTERNAL_START_WARNINGS_SUPPRESSION)
#define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION
#endif
#if !defined(CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION)
#define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION
#endif
#if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS)
#define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS
#endif
#if !defined(CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS)
#define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS
#endif
#if !defined(CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS)
#define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS
#endif
#if !defined(CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS)
#define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS
#endif

// The goal of this macro is to avoid evaluation of the arguments, but
// still have the compiler warn on problems inside...
#if !defined(CATCH_INTERNAL_IGNORE_BUT_WARN)
#define CATCH_INTERNAL_IGNORE_BUT_WARN(...)
#endif

#if defined(__APPLE__) && defined(__apple_build_version__) && (__clang_major__ < 10)
#undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS
#elif defined(__clang__) && (__clang_major__ < 5)
#undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS
#endif

#if !defined(CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS)
#define CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS
#endif

#if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
#define CATCH_TRY if ((true))
#define CATCH_CATCH_ALL if ((false))
#define CATCH_CATCH_ANON(type) if ((false))
#else
#define CATCH_TRY try
#define CATCH_CATCH_ALL catch (...)
#define CATCH_CATCH_ANON(type) catch (type)
#endif

#if defined(CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR) &&                                \
    !defined(CATCH_CONFIG_NO_TRADITIONAL_MSVC_PREPROCESSOR) &&                                     \
    !defined(CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR)
#define CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#endif

// end catch_compiler_capabilities.h
#define INTERNAL_CATCH_UNIQUE_NAME_LINE2(name, line) name##line
#define INTERNAL_CATCH_UNIQUE_NAME_LINE(name, line) INTERNAL_CATCH_UNIQUE_NAME_LINE2(name, line)
#ifdef CATCH_CONFIG_COUNTER
#define INTERNAL_CATCH_UNIQUE_NAME(name) INTERNAL_CATCH_UNIQUE_NAME_LINE(name, __COUNTER__)
#else
#define INTERNAL_CATCH_UNIQUE_NAME(name) INTERNAL_CATCH_UNIQUE_NAME_LINE(name, __LINE__)
#endif

#include <iosfwd>
#include <string>
#include <cstdint>

// We need a dummy global operator<< so we can bring it into Catch namespace
// later
struct Catch_global_namespace_dummy {};
std::ostream& operator<<(std::ostream&, Catch_global_namespace_dummy);

namespace Catch {

    struct CaseSensitive {
        enum Choice { Yes, No };
    };

    class NonCopyable {
        NonCopyable(NonCopyable const&) = delete;
        NonCopyable(NonCopyable&&) = delete;
        NonCopyable& operator=(NonCopyable const&) = delete;
        NonCopyable& operator=(NonCopyable&&) = delete;

    protected:
        NonCopyable();
        virtual ~NonCopyable();
    };

    struct SourceLineInfo {

        SourceLineInfo() = delete;
        SourceLineInfo(char const* _file, std::size_t _line) noexcept : file(_file), line(_line) {}

        SourceLineInfo(SourceLineInfo const& other) = default;
        SourceLineInfo& operator=(SourceLineInfo const&) = default;
        SourceLineInfo(SourceLineInfo&&) noexcept = default;
        SourceLineInfo& operator=(SourceLineInfo&&) noexcept = default;

        bool empty() const noexcept { return file[0] == '\0'; }
        bool operator==(SourceLineInfo const& other) const noexcept;
        bool operator<(SourceLineInfo const& other) const noexcept;

        char const* file;
        std::size_t line;
    };

    std::ostream& operator<<(std::ostream& os, SourceLineInfo const& info);

    // Bring in operator<< from global namespace into Catch namespace
    // This is necessary because the overload of operator<< above makes
    // lookup stop at namespace Catch
    using ::operator<<;

    // Use this in variadic streaming macros to allow
    //    >> +StreamEndStop
    // as well as
    //    >> stuff +StreamEndStop
    struct StreamEndStop {
        std::string operator+() const;
    };
    template <typename T> T const& operator+(T const& value, StreamEndStop) { return value; }
} // namespace Catch

#define CATCH_INTERNAL_LINEINFO                                                                    \
    ::Catch::SourceLineInfo(__FILE__, static_cast<std::size_t>(__LINE__))

// end catch_common.h
namespace Catch {

    struct RegistrarForTagAliases {
        RegistrarForTagAliases(char const* alias, char const* tag, SourceLineInfo const& lineInfo);
    };

} // end namespace Catch

#define CATCH_REGISTER_TAG_ALIAS(alias, spec)                                                      \
    CATCH_INTERNAL_START_WARNINGS_SUPPRESSION                                                      \
    CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS                                                       \
    namespace {                                                                                    \
        Catch::RegistrarForTagAliases INTERNAL_CATCH_UNIQUE_NAME(AutoRegisterTagAlias)(            \
            alias, spec, CATCH_INTERNAL_LINEINFO);                                                 \
    }                                                                                              \
    CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION

// end catch_tag_alias_autoregistrar.h
// start catch_test_registry.h

// start catch_interfaces_testcase.h

#include <vector>

namespace Catch {

    class TestSpec;

    struct ITestInvoker {
        virtual void invoke() const = 0;
        virtual ~ITestInvoker();
    };

    class TestCase;
    struct IConfig;

    struct ITestCaseRegistry {
        virtual ~ITestCaseRegistry();
        virtual std::vector<TestCase> const& getAllTests() const = 0;
        virtual std::vector<TestCase> const& getAllTestsSorted(IConfig const& config) const = 0;
    };

    bool isThrowSafe(TestCase const& testCase, IConfig const& config);
    bool matchTest(TestCase const& testCase, TestSpec const& testSpec, IConfig const& config);
    std::vector<TestCase> filterTests(std::vector<TestCase> const& testCases,
                                      TestSpec const& testSpec,
                                      IConfig const& config);
    std::vector<TestCase> const& getAllTestCasesSorted(IConfig const& config);

} // namespace Catch

// end catch_interfaces_testcase.h
// start catch_stringref.h

#include <cstddef>
#include <string>
#include <iosfwd>
#include <cassert>

namespace Catch {

    /// A non-owning string class (similar to the forthcoming std::string_view)
    /// Note that, because a StringRef may be a substring of another string,
    /// it may not be null terminated.
    class StringRef {
    public:
        using size_type = std::size_t;
        using const_iterator = const char*;

    private:
        static constexpr char const* const s_empty = "";

        char const* m_start = s_empty;
        size_type m_size = 0;

    public: // construction
        constexpr StringRef() noexcept = default;

        StringRef(char const* rawChars) noexcept;

        constexpr StringRef(char const* rawChars, size_type size) noexcept :
            m_start(rawChars), m_size(size) {}

        StringRef(std::string const& stdString) noexcept :
            m_start(stdString.c_str()), m_size(stdString.size()) {}

        explicit operator std::string() const { return std::string(m_start, m_size); }

    public: // operators
        auto operator==(StringRef const& other) const noexcept -> bool;
        auto operator!=(StringRef const& other) const noexcept -> bool { return !(*this == other); }

        auto operator[](size_type index) const noexcept -> char {
            assert(index < m_size);
            return m_start[index];
        }

    public: // named queries
        constexpr auto empty() const noexcept -> bool { return m_size == 0; }
        constexpr auto size() const noexcept -> size_type { return m_size; }

        // Returns the current start pointer. If the StringRef is not
        // null-terminated, throws std::domain_exception
        auto c_str() const -> char const*;

    public: // substrings and searches
        // Returns a substring of [start, start + length).
        // If start + length > size(), then the substring is [start, size()).
        // If start > size(), then the substring is empty.
        auto substr(size_type start, size_type length) const noexcept -> StringRef;

        // Returns the current start pointer. May not be null-terminated.
        auto data() const noexcept -> char const*;

        constexpr auto isNullTerminated() const noexcept -> bool { return m_start[m_size] == '\0'; }

    public: // iterators
        constexpr const_iterator begin() const { return m_start; }
        constexpr const_iterator end() const { return m_start + m_size; }
    };

    auto operator+=(std::string& lhs, StringRef const& sr) -> std::string&;
    auto operator<<(std::ostream& os, StringRef const& sr) -> std::ostream&;

    constexpr auto operator"" _sr(char const* rawChars, std::size_t size) noexcept -> StringRef {
        return StringRef(rawChars, size);
    }
} // namespace Catch

constexpr auto operator"" _catch_sr(char const* rawChars, std::size_t size) noexcept
    -> Catch::StringRef {
    return Catch::StringRef(rawChars, size);
}

// end catch_stringref.h
// start catch_preprocessor.hpp

#define CATCH_RECURSION_LEVEL0(...) __VA_ARGS__
#define CATCH_RECURSION_LEVEL1(...)                                                                \
    CATCH_RECURSION_LEVEL0(CATCH_RECURSION_LEVEL0(CATCH_RECURSION_LEVEL0(__VA_ARGS__)))
#define CATCH_RECURSION_LEVEL2(...)                                                                \
    CATCH_RECURSION_LEVEL1(CATCH_RECURSION_LEVEL1(CATCH_RECURSION_LEVEL1(__VA_ARGS__)))
#define CATCH_RECURSION_LEVEL3(...)                                                                \
    CATCH_RECURSION_LEVEL2(CATCH_RECURSION_LEVEL2(CATCH_RECURSION_LEVEL2(__VA_ARGS__)))
#define CATCH_RECURSION_LEVEL4(...)                                                                \
    CATCH_RECURSION_LEVEL3(CATCH_RECURSION_LEVEL3(CATCH_RECURSION_LEVEL3(__VA_ARGS__)))
#define CATCH_RECURSION_LEVEL5(...)                                                                \
    CATCH_RECURSION_LEVEL4(CATCH_RECURSION_LEVEL4(CATCH_RECURSION_LEVEL4(__VA_ARGS__)))

#ifdef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define INTERNAL_CATCH_EXPAND_VARGS(...) __VA_ARGS__
// MSVC needs more evaluations
#define CATCH_RECURSION_LEVEL6(...)                                                                \
    CATCH_RECURSION_LEVEL5(CATCH_RECURSION_LEVEL5(CATCH_RECURSION_LEVEL5(__VA_ARGS__)))
#define CATCH_RECURSE(...) CATCH_RECURSION_LEVEL6(CATCH_RECURSION_LEVEL6(__VA_ARGS__))
#else
#define CATCH_RECURSE(...) CATCH_RECURSION_LEVEL5(__VA_ARGS__)
#endif

#define CATCH_REC_END(...)
#define CATCH_REC_OUT

#define CATCH_EMPTY()
#define CATCH_DEFER(id) id CATCH_EMPTY()

#define CATCH_REC_GET_END2() 0, CATCH_REC_END
#define CATCH_REC_GET_END1(...) CATCH_REC_GET_END2
#define CATCH_REC_GET_END(...) CATCH_REC_GET_END1
#define CATCH_REC_NEXT0(test, next, ...) next CATCH_REC_OUT
#define CATCH_REC_NEXT1(test, next) CATCH_DEFER(CATCH_REC_NEXT0)(test, next, 0)
#define CATCH_REC_NEXT(test, next) CATCH_REC_NEXT1(CATCH_REC_GET_END test, next)

#define CATCH_REC_LIST0(f, x, peek, ...)                                                           \
    , f(x) CATCH_DEFER(CATCH_REC_NEXT(peek, CATCH_REC_LIST1))(f, peek, __VA_ARGS__)
#define CATCH_REC_LIST1(f, x, peek, ...)                                                           \
    , f(x) CATCH_DEFER(CATCH_REC_NEXT(peek, CATCH_REC_LIST0))(f, peek, __VA_ARGS__)
#define CATCH_REC_LIST2(f, x, peek, ...)                                                           \
    f(x) CATCH_DEFER(CATCH_REC_NEXT(peek, CATCH_REC_LIST1))(f, peek, __VA_ARGS__)

#define CATCH_REC_LIST0_UD(f, userdata, x, peek, ...)                                              \
    , f(userdata, x)                                                                               \
          CATCH_DEFER(CATCH_REC_NEXT(peek, CATCH_REC_LIST1_UD))(f, userdata, peek, __VA_ARGS__)
#define CATCH_REC_LIST1_UD(f, userdata, x, peek, ...)                                              \
    , f(userdata, x)                                                                               \
          CATCH_DEFER(CATCH_REC_NEXT(peek, CATCH_REC_LIST0_UD))(f, userdata, peek, __VA_ARGS__)
#define CATCH_REC_LIST2_UD(f, userdata, x, peek, ...)                                              \
    f(userdata, x)                                                                                 \
        CATCH_DEFER(CATCH_REC_NEXT(peek, CATCH_REC_LIST1_UD))(f, userdata, peek, __VA_ARGS__)

// Applies the function macro `f` to each of the remaining parameters, inserts
// commas between the results, and passes userdata as the first parameter to
// each invocation, e.g. CATCH_REC_LIST_UD(f, x, a, b, c) evaluates to f(x, a),
// f(x, b), f(x, c)
#define CATCH_REC_LIST_UD(f, userdata, ...)                                                        \
    CATCH_RECURSE(CATCH_REC_LIST2_UD(f, userdata, __VA_ARGS__, ()()(), ()()(), ()()(), 0))

#define CATCH_REC_LIST(f, ...)                                                                     \
    CATCH_RECURSE(CATCH_REC_LIST2(f, __VA_ARGS__, ()()(), ()()(), ()()(), 0))

#define INTERNAL_CATCH_EXPAND1(param) INTERNAL_CATCH_EXPAND2(param)
#define INTERNAL_CATCH_EXPAND2(...) INTERNAL_CATCH_NO##__VA_ARGS__
#define INTERNAL_CATCH_DEF(...) INTERNAL_CATCH_DEF __VA_ARGS__
#define INTERNAL_CATCH_NOINTERNAL_CATCH_DEF
#define INTERNAL_CATCH_STRINGIZE(...) INTERNAL_CATCH_STRINGIZE2(__VA_ARGS__)
#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define INTERNAL_CATCH_STRINGIZE2(...) #__VA_ARGS__
#define INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS(param)                                             \
    INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_REMOVE_PARENS(param))
#else
// MSVC is adding extra space and needs another indirection to expand
// INTERNAL_CATCH_NOINTERNAL_CATCH_DEF
#define INTERNAL_CATCH_STRINGIZE2(...) INTERNAL_CATCH_STRINGIZE3(__VA_ARGS__)
#define INTERNAL_CATCH_STRINGIZE3(...) #__VA_ARGS__
#define INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS(param)                                             \
    (INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_REMOVE_PARENS(param)) + 1)
#endif

#define INTERNAL_CATCH_MAKE_NAMESPACE2(...) ns_##__VA_ARGS__
#define INTERNAL_CATCH_MAKE_NAMESPACE(name) INTERNAL_CATCH_MAKE_NAMESPACE2(name)

#define INTERNAL_CATCH_REMOVE_PARENS(...) INTERNAL_CATCH_EXPAND1(INTERNAL_CATCH_DEF __VA_ARGS__)

#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define INTERNAL_CATCH_MAKE_TYPE_LIST2(...)                                                        \
    decltype(get_wrapper<INTERNAL_CATCH_REMOVE_PARENS_GEN(__VA_ARGS__)>())
#define INTERNAL_CATCH_MAKE_TYPE_LIST(...)                                                         \
    INTERNAL_CATCH_MAKE_TYPE_LIST2(INTERNAL_CATCH_REMOVE_PARENS(__VA_ARGS__))
#else
#define INTERNAL_CATCH_MAKE_TYPE_LIST2(...)                                                        \
    INTERNAL_CATCH_EXPAND_VARGS(                                                                   \
        decltype(get_wrapper<INTERNAL_CATCH_REMOVE_PARENS_GEN(__VA_ARGS__)>()))
#define INTERNAL_CATCH_MAKE_TYPE_LIST(...)                                                         \
    INTERNAL_CATCH_EXPAND_VARGS(                                                                   \
        INTERNAL_CATCH_MAKE_TYPE_LIST2(INTERNAL_CATCH_REMOVE_PARENS(__VA_ARGS__)))
#endif

#define INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(...)                                             \
    CATCH_REC_LIST(INTERNAL_CATCH_MAKE_TYPE_LIST, __VA_ARGS__)

#define INTERNAL_CATCH_REMOVE_PARENS_1_ARG(_0) INTERNAL_CATCH_REMOVE_PARENS(_0)
#define INTERNAL_CATCH_REMOVE_PARENS_2_ARG(_0, _1)                                                 \
    INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_1_ARG(_1)
#define INTERNAL_CATCH_REMOVE_PARENS_3_ARG(_0, _1, _2)                                             \
    INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_2_ARG(_1, _2)
#define INTERNAL_CATCH_REMOVE_PARENS_4_ARG(_0, _1, _2, _3)                                         \
    INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_3_ARG(_1, _2, _3)
#define INTERNAL_CATCH_REMOVE_PARENS_5_ARG(_0, _1, _2, _3, _4)                                     \
    INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_4_ARG(_1, _2, _3, _4)
#define INTERNAL_CATCH_REMOVE_PARENS_6_ARG(_0, _1, _2, _3, _4, _5)                                 \
    INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_5_ARG(_1, _2, _3, _4, _5)
#define INTERNAL_CATCH_REMOVE_PARENS_7_ARG(_0, _1, _2, _3, _4, _5, _6)                             \
    INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_6_ARG(_1, _2, _3, _4, _5, _6)
#define INTERNAL_CATCH_REMOVE_PARENS_8_ARG(_0, _1, _2, _3, _4, _5, _6, _7)                         \
    INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_7_ARG(_1, _2, _3, _4, _5, _6, _7)
#define INTERNAL_CATCH_REMOVE_PARENS_9_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8)                     \
    INTERNAL_CATCH_REMOVE_PARENS(_0),                                                              \
        INTERNAL_CATCH_REMOVE_PARENS_8_ARG(_1, _2, _3, _4, _5, _6, _7, _8)
#define INTERNAL_CATCH_REMOVE_PARENS_10_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9)                \
    INTERNAL_CATCH_REMOVE_PARENS(_0),                                                              \
        INTERNAL_CATCH_REMOVE_PARENS_9_ARG(_1, _2, _3, _4, _5, _6, _7, _8, _9)
#define INTERNAL_CATCH_REMOVE_PARENS_11_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10)           \
    INTERNAL_CATCH_REMOVE_PARENS(_0),                                                              \
        INTERNAL_CATCH_REMOVE_PARENS_10_ARG(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10)

#define INTERNAL_CATCH_VA_NARGS_IMPL(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N

#define INTERNAL_CATCH_TYPE_GEN                                                                    \
    template <typename...> struct TypeList {};                                                     \
    template <typename... Ts> constexpr auto get_wrapper() noexcept->TypeList<Ts...> {             \
        return {};                                                                                 \
    }                                                                                              \
    template <template <typename...> class...> struct TemplateTypeList {};                         \
    template <template <typename...> class... Cs>                                                  \
    constexpr auto get_wrapper() noexcept->TemplateTypeList<Cs...> {                               \
        return {};                                                                                 \
    }                                                                                              \
    template <typename...> struct append;                                                          \
    template <typename...> struct rewrap;                                                          \
    template <template <typename...> class, typename...> struct create;                            \
    template <template <typename...> class, typename> struct convert;                              \
                                                                                                   \
    template <typename T> struct append<T> { using type = T; };                                    \
    template <template <typename...> class L1,                                                     \
              typename... E1,                                                                      \
              template <typename...>                                                               \
              class L2,                                                                            \
              typename... E2,                                                                      \
              typename... Rest>                                                                    \
    struct append<L1<E1...>, L2<E2...>, Rest...> {                                                 \
        using type = typename append<L1<E1..., E2...>, Rest...>::type;                             \
    };                                                                                             \
    template <template <typename...> class L1, typename... E1, typename... Rest>                   \
    struct append<L1<E1...>, TypeList<mpl_::na>, Rest...> {                                        \
        using type = L1<E1...>;                                                                    \
    };                                                                                             \
                                                                                                   \
    template <template <typename...> class Container,                                              \
              template <typename...>                                                               \
              class List,                                                                          \
              typename... elems>                                                                   \
    struct rewrap<TemplateTypeList<Container>, List<elems...>> {                                   \
        using type = TypeList<Container<elems...>>;                                                \
    };                                                                                             \
    template <template <typename...> class Container,                                              \
              template <typename...>                                                               \
              class List,                                                                          \
              class... Elems,                                                                      \
              typename... Elements>                                                                \
    struct rewrap<TemplateTypeList<Container>, List<Elems...>, Elements...> {                      \
        using type = typename append<                                                              \
            TypeList<Container<Elems...>>,                                                         \
            typename rewrap<TemplateTypeList<Container>, Elements...>::type>::type;                \
    };                                                                                             \
                                                                                                   \
    template <template <typename...> class Final,                                                  \
              template <typename...>                                                               \
              class... Containers,                                                                 \
              typename... Types>                                                                   \
    struct create<Final, TemplateTypeList<Containers...>, TypeList<Types...>> {                    \
        using type = typename append<                                                              \
            Final<>,                                                                               \
            typename rewrap<TemplateTypeList<Containers>, Types...>::type...>::type;               \
    };                                                                                             \
    template <template <typename...> class Final,                                                  \
              template <typename...>                                                               \
              class List,                                                                          \
              typename... Ts>                                                                      \
    struct convert<Final, List<Ts...>> {                                                           \
        using type = typename append<Final<>, TypeList<Ts>...>::type;                              \
    };

#define INTERNAL_CATCH_NTTP_1(signature, ...)                                                      \
    template <INTERNAL_CATCH_REMOVE_PARENS(signature)> struct Nttp {};                             \
    template <INTERNAL_CATCH_REMOVE_PARENS(signature)>                                             \
    constexpr auto get_wrapper() noexcept->Nttp<__VA_ARGS__> {                                     \
        return {};                                                                                 \
    }                                                                                              \
    template <template <INTERNAL_CATCH_REMOVE_PARENS(signature)> class...>                         \
    struct NttpTemplateTypeList {};                                                                \
    template <template <INTERNAL_CATCH_REMOVE_PARENS(signature)> class... Cs>                      \
    constexpr auto get_wrapper() noexcept->NttpTemplateTypeList<Cs...> {                           \
        return {};                                                                                 \
    }                                                                                              \
                                                                                                   \
    template <template <INTERNAL_CATCH_REMOVE_PARENS(signature)> class Container,                  \
              template <INTERNAL_CATCH_REMOVE_PARENS(signature)>                                   \
              class List,                                                                          \
              INTERNAL_CATCH_REMOVE_PARENS(signature)>                                             \
    struct rewrap<NttpTemplateTypeList<Container>, List<__VA_ARGS__>> {                            \
        using type = TypeList<Container<__VA_ARGS__>>;                                             \
    };                                                                                             \
    template <template <INTERNAL_CATCH_REMOVE_PARENS(signature)> class Container,                  \
              template <INTERNAL_CATCH_REMOVE_PARENS(signature)>                                   \
              class List,                                                                          \
              INTERNAL_CATCH_REMOVE_PARENS(signature),                                             \
              typename... Elements>                                                                \
    struct rewrap<NttpTemplateTypeList<Container>, List<__VA_ARGS__>, Elements...> {               \
        using type = typename append<                                                              \
            TypeList<Container<__VA_ARGS__>>,                                                      \
            typename rewrap<NttpTemplateTypeList<Container>, Elements...>::type>::type;            \
    };                                                                                             \
    template <template <typename...> class Final,                                                  \
              template <INTERNAL_CATCH_REMOVE_PARENS(signature)>                                   \
              class... Containers,                                                                 \
              typename... Types>                                                                   \
    struct create<Final, NttpTemplateTypeList<Containers...>, TypeList<Types...>> {                \
        using type = typename append<                                                              \
            Final<>,                                                                               \
            typename rewrap<NttpTemplateTypeList<Containers>, Types...>::type...>::type;           \
    };

#define INTERNAL_CATCH_DECLARE_SIG_TEST0(TestName)
#define INTERNAL_CATCH_DECLARE_SIG_TEST1(TestName, signature)                                      \
    template <INTERNAL_CATCH_REMOVE_PARENS(signature)> static void TestName()
#define INTERNAL_CATCH_DECLARE_SIG_TEST_X(TestName, signature, ...)                                \
    template <INTERNAL_CATCH_REMOVE_PARENS(signature)> static void TestName()

#define INTERNAL_CATCH_DEFINE_SIG_TEST0(TestName)
#define INTERNAL_CATCH_DEFINE_SIG_TEST1(TestName, signature)                                       \
    template <INTERNAL_CATCH_REMOVE_PARENS(signature)> static void TestName()
#define INTERNAL_CATCH_DEFINE_SIG_TEST_X(TestName, signature, ...)                                 \
    template <INTERNAL_CATCH_REMOVE_PARENS(signature)> static void TestName()

#define INTERNAL_CATCH_NTTP_REGISTER0(TestFunc, signature)                                         \
    template <typename Type> void reg_test(TypeList<Type>, Catch::NameAndTags nameAndTags) {       \
        Catch::AutoReg(Catch::makeTestInvoker(&TestFunc<Type>),                                    \
                       CATCH_INTERNAL_LINEINFO,                                                    \
                       Catch::StringRef(),                                                         \
                       nameAndTags);                                                               \
    }

#define INTERNAL_CATCH_NTTP_REGISTER(TestFunc, signature, ...)                                     \
    template <INTERNAL_CATCH_REMOVE_PARENS(signature)>                                             \
    void reg_test(Nttp<__VA_ARGS__>, Catch::NameAndTags nameAndTags) {                             \
        Catch::AutoReg(Catch::makeTestInvoker(&TestFunc<__VA_ARGS__>),                             \
                       CATCH_INTERNAL_LINEINFO,                                                    \
                       Catch::StringRef(),                                                         \
                       nameAndTags);                                                               \
    }

#define INTERNAL_CATCH_NTTP_REGISTER_METHOD0(TestName, signature, ...)                             \
    template <typename Type>                                                                       \
    void reg_test(TypeList<Type>, Catch::StringRef className, Catch::NameAndTags nameAndTags) {    \
        Catch::AutoReg(Catch::makeTestInvoker(&TestName<Type>::test),                              \
                       CATCH_INTERNAL_LINEINFO,                                                    \
                       className,                                                                  \
                       nameAndTags);                                                               \
    }

#define INTERNAL_CATCH_NTTP_REGISTER_METHOD(TestName, signature, ...)                              \
    template <INTERNAL_CATCH_REMOVE_PARENS(signature)>                                             \
    void reg_test(Nttp<__VA_ARGS__>, Catch::StringRef className, Catch::NameAndTags nameAndTags) { \
        Catch::AutoReg(Catch::makeTestInvoker(&TestName<__VA_ARGS__>::test),                       \
                       CATCH_INTERNAL_LINEINFO,                                                    \
                       className,                                                                  \
                       nameAndTags);                                                               \
    }

#define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD0(TestName, ClassName)
#define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD1(TestName, ClassName, signature)                    \
    template <typename TestType>                                                                   \
    struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName)<TestType> {                          \
        void test();                                                                               \
    }

#define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X(TestName, ClassName, signature, ...)              \
    template <INTERNAL_CATCH_REMOVE_PARENS(signature)>                                             \
    struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName)<__VA_ARGS__> {                       \
        void test();                                                                               \
    }

#define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD0(TestName)
#define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD1(TestName, signature)                                \
    template <typename TestType>                                                                   \
    void INTERNAL_CATCH_MAKE_NAMESPACE(TestName)::TestName<TestType>::test()
#define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X(TestName, signature, ...)                          \
    template <INTERNAL_CATCH_REMOVE_PARENS(signature)>                                             \
    void INTERNAL_CATCH_MAKE_NAMESPACE(TestName)::TestName<__VA_ARGS__>::test()

#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define INTERNAL_CATCH_NTTP_0
#define INTERNAL_CATCH_NTTP_GEN(...)                                                               \
    INTERNAL_CATCH_VA_NARGS_IMPL(__VA_ARGS__,                                                      \
                                 INTERNAL_CATCH_NTTP_1(__VA_ARGS__),                               \
                                 INTERNAL_CATCH_NTTP_1(__VA_ARGS__),                               \
                                 INTERNAL_CATCH_NTTP_1(__VA_ARGS__),                               \
                                 INTERNAL_CATCH_NTTP_1(__VA_ARGS__),                               \
                                 INTERNAL_CATCH_NTTP_1(__VA_ARGS__),                               \
                                 INTERNAL_CATCH_NTTP_1(__VA_ARGS__),                               \
                                 INTERNAL_CATCH_NTTP_1(__VA_ARGS__),                               \
                                 INTERNAL_CATCH_NTTP_1(__VA_ARGS__),                               \
                                 INTERNAL_CATCH_NTTP_1(__VA_ARGS__),                               \
                                 INTERNAL_CATCH_NTTP_1(__VA_ARGS__),                               \
                                 INTERNAL_CATCH_NTTP_0)
#define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD(TestName, ...)                                       \
    INTERNAL_CATCH_VA_NARGS_IMPL("dummy",                                                          \
                                 __VA_ARGS__,                                                      \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,                          \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,                          \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,                          \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,                          \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,                          \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,                          \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,                          \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,                          \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,                          \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD1,                           \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD0)                           \
    (TestName, __VA_ARGS__)
#define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD(TestName, ClassName, ...)                           \
    INTERNAL_CATCH_VA_NARGS_IMPL("dummy",                                                          \
                                 __VA_ARGS__,                                                      \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,                         \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,                         \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,                         \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,                         \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,                         \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,                         \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,                         \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,                         \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,                         \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD1,                          \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD0)                          \
    (TestName, ClassName, __VA_ARGS__)
#define INTERNAL_CATCH_NTTP_REG_METHOD_GEN(TestName, ...)                                          \
    INTERNAL_CATCH_VA_NARGS_IMPL("dummy",                                                          \
                                 __VA_ARGS__,                                                      \
                                 INTERNAL_CATCH_NTTP_REGISTER_METHOD,                              \
                                 INTERNAL_CATCH_NTTP_REGISTER_METHOD,                              \
                                 INTERNAL_CATCH_NTTP_REGISTER_METHOD,                              \
                                 INTERNAL_CATCH_NTTP_REGISTER_METHOD,                              \
                                 INTERNAL_CATCH_NTTP_REGISTER_METHOD,                              \
                                 INTERNAL_CATCH_NTTP_REGISTER_METHOD,                              \
                                 INTERNAL_CATCH_NTTP_REGISTER_METHOD,                              \
                                 INTERNAL_CATCH_NTTP_REGISTER_METHOD,                              \
                                 INTERNAL_CATCH_NTTP_REGISTER_METHOD,                              \
                                 INTERNAL_CATCH_NTTP_REGISTER_METHOD0,                             \
                                 INTERNAL_CATCH_NTTP_REGISTER_METHOD0)                             \
    (TestName, __VA_ARGS__)
#define INTERNAL_CATCH_NTTP_REG_GEN(TestFunc, ...)                                                 \
    INTERNAL_CATCH_VA_NARGS_IMPL("dummy",                                                          \
                                 __VA_ARGS__,                                                      \
                                 INTERNAL_CATCH_NTTP_REGISTER,                                     \
                                 INTERNAL_CATCH_NTTP_REGISTER,                                     \
                                 INTERNAL_CATCH_NTTP_REGISTER,                                     \
                                 INTERNAL_CATCH_NTTP_REGISTER,                                     \
                                 INTERNAL_CATCH_NTTP_REGISTER,                                     \
                                 INTERNAL_CATCH_NTTP_REGISTER,                                     \
                                 INTERNAL_CATCH_NTTP_REGISTER,                                     \
                                 INTERNAL_CATCH_NTTP_REGISTER,                                     \
                                 INTERNAL_CATCH_NTTP_REGISTER,                                     \
                                 INTERNAL_CATCH_NTTP_REGISTER0,                                    \
                                 INTERNAL_CATCH_NTTP_REGISTER0)                                    \
    (TestFunc, __VA_ARGS__)
#define INTERNAL_CATCH_DEFINE_SIG_TEST(TestName, ...)                                              \
    INTERNAL_CATCH_VA_NARGS_IMPL("dummy",                                                          \
                                 __VA_ARGS__,                                                      \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_X,                                 \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_X,                                 \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_X,                                 \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_X,                                 \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_X,                                 \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_X,                                 \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_X,                                 \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_X,                                 \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_X,                                 \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST1,                                  \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST0)                                  \
    (TestName, __VA_ARGS__)
#define INTERNAL_CATCH_DECLARE_SIG_TEST(TestName, ...)                                             \
    INTERNAL_CATCH_VA_NARGS_IMPL("dummy",                                                          \
                                 __VA_ARGS__,                                                      \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST_X,                                \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST_X,                                \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST_X,                                \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST_X,                                \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST_X,                                \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST_X,                                \
                                 INTERNAL_CATCH_DEFINE_SIG_TEST_X,                                 \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST_X,                                \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST_X,                                \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST1,                                 \
                                 INTERNAL_CATCH_DECLARE_SIG_TEST0)                                 \
    (TestName, __VA_ARGS__)
#define INTERNAL_CATCH_REMOVE_PARENS_GEN(...)                                                      \
    INTERNAL_CATCH_VA_NARGS_IMPL(__VA_ARGS__,                                                      \
                                 INTERNAL_CATCH_REMOVE_PARENS_11_ARG,                              \
                                 INTERNAL_CATCH_REMOVE_PARENS_10_ARG,                              \
                                 INTERNAL_CATCH_REMOVE_PARENS_9_ARG,                               \
                                 INTERNAL_CATCH_REMOVE_PARENS_8_ARG,                               \
                                 INTERNAL_CATCH_REMOVE_PARENS_7_ARG,                               \
                                 INTERNAL_CATCH_REMOVE_PARENS_6_ARG,                               \
                                 INTERNAL_CATCH_REMOVE_PARENS_5_ARG,                               \
                                 INTERNAL_CATCH_REMOVE_PARENS_4_ARG,                               \
                                 INTERNAL_CATCH_REMOVE_PARENS_3_ARG,                               \
                                 INTERNAL_CATCH_REMOVE_PARENS_2_ARG,                               \
                                 INTERNAL_CATCH_REMOVE_PARENS_1_ARG)                               \
    (__VA_ARGS__)
#else
#define INTERNAL_CATCH_NTTP_0(signature)
#define INTERNAL_CATCH_NTTP_GEN(...)                                                               \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL(__VA_ARGS__,                          \
                                                             INTERNAL_CATCH_NTTP_1,                \
                                                             INTERNAL_CATCH_NTTP_1,                \
                                                             INTERNAL_CATCH_NTTP_1,                \
                                                             INTERNAL_CATCH_NTTP_1,                \
                                                             INTERNAL_CATCH_NTTP_1,                \
                                                             INTERNAL_CATCH_NTTP_1,                \
                                                             INTERNAL_CATCH_NTTP_1,                \
                                                             INTERNAL_CATCH_NTTP_1,                \
                                                             INTERNAL_CATCH_NTTP_1,                \
                                                             INTERNAL_CATCH_NTTP_1,                \
                                                             INTERNAL_CATCH_NTTP_0)(__VA_ARGS__))
#define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD(TestName, ...)                                       \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL(                                      \
        "dummy",                                                                                   \
        __VA_ARGS__,                                                                               \
        INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,                                                   \
        INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,                                                   \
        INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,                                                   \
        INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,                                                   \
        INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,                                                   \
        INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,                                                   \
        INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,                                                   \
        INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,                                                   \
        INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,                                                   \
        INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD1,                                                    \
        INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD0)(TestName, __VA_ARGS__))
#define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD(TestName, ClassName, ...)                           \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL(                                      \
        "dummy",                                                                                   \
        __VA_ARGS__,                                                                               \
        INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,                                                  \
        INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,                                                  \
        INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,                                                  \
        INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,                                                  \
        INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,                                                  \
        INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,                                                  \
        INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,                                                  \
        INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,                                                  \
        INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,                                                  \
        INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD1,                                                   \
        INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD0)(TestName, ClassName, __VA_ARGS__))
#define INTERNAL_CATCH_NTTP_REG_METHOD_GEN(TestName, ...)                                          \
    INTERNAL_CATCH_EXPAND_VARGS(                                                                   \
        INTERNAL_CATCH_VA_NARGS_IMPL("dummy",                                                      \
                                     __VA_ARGS__,                                                  \
                                     INTERNAL_CATCH_NTTP_REGISTER_METHOD,                          \
                                     INTERNAL_CATCH_NTTP_REGISTER_METHOD,                          \
                                     INTERNAL_CATCH_NTTP_REGISTER_METHOD,                          \
                                     INTERNAL_CATCH_NTTP_REGISTER_METHOD,                          \
                                     INTERNAL_CATCH_NTTP_REGISTER_METHOD,                          \
                                     INTERNAL_CATCH_NTTP_REGISTER_METHOD,                          \
                                     INTERNAL_CATCH_NTTP_REGISTER_METHOD,                          \
                                     INTERNAL_CATCH_NTTP_REGISTER_METHOD,                          \
                                     INTERNAL_CATCH_NTTP_REGISTER_METHOD,                          \
                                     INTERNAL_CATCH_NTTP_REGISTER_METHOD0,                         \
                                     INTERNAL_CATCH_NTTP_REGISTER_METHOD0)(TestName, __VA_ARGS__))
#define INTERNAL_CATCH_NTTP_REG_GEN(TestFunc, ...)                                                 \
    INTERNAL_CATCH_EXPAND_VARGS(                                                                   \
        INTERNAL_CATCH_VA_NARGS_IMPL("dummy",                                                      \
                                     __VA_ARGS__,                                                  \
                                     INTERNAL_CATCH_NTTP_REGISTER,                                 \
                                     INTERNAL_CATCH_NTTP_REGISTER,                                 \
                                     INTERNAL_CATCH_NTTP_REGISTER,                                 \
                                     INTERNAL_CATCH_NTTP_REGISTER,                                 \
                                     INTERNAL_CATCH_NTTP_REGISTER,                                 \
                                     INTERNAL_CATCH_NTTP_REGISTER,                                 \
                                     INTERNAL_CATCH_NTTP_REGISTER,                                 \
                                     INTERNAL_CATCH_NTTP_REGISTER,                                 \
                                     INTERNAL_CATCH_NTTP_REGISTER,                                 \
                                     INTERNAL_CATCH_NTTP_REGISTER0,                                \
                                     INTERNAL_CATCH_NTTP_REGISTER0)(TestFunc, __VA_ARGS__))
#define INTERNAL_CATCH_DEFINE_SIG_TEST(TestName, ...)                                              \
    INTERNAL_CATCH_EXPAND_VARGS(                                                                   \
        INTERNAL_CATCH_VA_NARGS_IMPL("dummy",                                                      \
                                     __VA_ARGS__,                                                  \
                                     INTERNAL_CATCH_DEFINE_SIG_TEST_X,                             \
                                     INTERNAL_CATCH_DEFINE_SIG_TEST_X,                             \
                                     INTERNAL_CATCH_DEFINE_SIG_TEST_X,                             \
                                     INTERNAL_CATCH_DEFINE_SIG_TEST_X,                             \
                                     INTERNAL_CATCH_DEFINE_SIG_TEST_X,                             \
                                     INTERNAL_CATCH_DEFINE_SIG_TEST_X,                             \
                                     INTERNAL_CATCH_DEFINE_SIG_TEST_X,                             \
                                     INTERNAL_CATCH_DEFINE_SIG_TEST_X,                             \
                                     INTERNAL_CATCH_DEFINE_SIG_TEST_X,                             \
                                     INTERNAL_CATCH_DEFINE_SIG_TEST1,                              \
                                     INTERNAL_CATCH_DEFINE_SIG_TEST0)(TestName, __VA_ARGS__))
#define INTERNAL_CATCH_DECLARE_SIG_TEST(TestName, ...)                                             \
    INTERNAL_CATCH_EXPAND_VARGS(                                                                   \
        INTERNAL_CATCH_VA_NARGS_IMPL("dummy",                                                      \
                                     __VA_ARGS__,                                                  \
                                     INTERNAL_CATCH_DECLARE_SIG_TEST_X,                            \
                                     INTERNAL_CATCH_DECLARE_SIG_TEST_X,                            \
                                     INTERNAL_CATCH_DECLARE_SIG_TEST_X,                            \
                                     INTERNAL_CATCH_DECLARE_SIG_TEST_X,                            \
                                     INTERNAL_CATCH_DECLARE_SIG_TEST_X,                            \
                                     INTERNAL_CATCH_DECLARE_SIG_TEST_X,                            \
                                     INTERNAL_CATCH_DEFINE_SIG_TEST_X,                             \
                                     INTERNAL_CATCH_DECLARE_SIG_TEST_X,                            \
                                     INTERNAL_CATCH_DECLARE_SIG_TEST_X,                            \
                                     INTERNAL_CATCH_DECLARE_SIG_TEST1,                             \
                                     INTERNAL_CATCH_DECLARE_SIG_TEST0)(TestName, __VA_ARGS__))
#define INTERNAL_CATCH_REMOVE_PARENS_GEN(...)                                                      \
    INTERNAL_CATCH_EXPAND_VARGS(                                                                   \
        INTERNAL_CATCH_VA_NARGS_IMPL(__VA_ARGS__,                                                  \
                                     INTERNAL_CATCH_REMOVE_PARENS_11_ARG,                          \
                                     INTERNAL_CATCH_REMOVE_PARENS_10_ARG,                          \
                                     INTERNAL_CATCH_REMOVE_PARENS_9_ARG,                           \
                                     INTERNAL_CATCH_REMOVE_PARENS_8_ARG,                           \
                                     INTERNAL_CATCH_REMOVE_PARENS_7_ARG,                           \
                                     INTERNAL_CATCH_REMOVE_PARENS_6_ARG,                           \
                                     INTERNAL_CATCH_REMOVE_PARENS_5_ARG,                           \
                                     INTERNAL_CATCH_REMOVE_PARENS_4_ARG,                           \
                                     INTERNAL_CATCH_REMOVE_PARENS_3_ARG,                           \
                                     INTERNAL_CATCH_REMOVE_PARENS_2_ARG,                           \
                                     INTERNAL_CATCH_REMOVE_PARENS_1_ARG)(__VA_ARGS__))
#endif

// end catch_preprocessor.hpp
// start catch_meta.hpp

#include <type_traits>

namespace Catch {
    template <typename T> struct always_false : std::false_type {};

    template <typename> struct true_given : std::true_type {};
    struct is_callable_tester {
        template <typename Fun, typename... Args>
        true_given<decltype(std::declval<Fun>()(std::declval<Args>()...))> static test(int);
        template <typename...> std::false_type static test(...);
    };

    template <typename T> struct is_callable;

    template <typename Fun, typename... Args>
    struct is_callable<Fun(Args...)> : decltype(is_callable_tester::test<Fun, Args...>(0)) {};

#if defined(__cpp_lib_is_invocable) && __cpp_lib_is_invocable >= 201703
    // std::result_of is deprecated in C++17 and removed in C++20. Hence, it is
    // replaced with std::invoke_result here.
    template <typename Func, typename... U>
    using FunctionReturnType =
        std::remove_reference_t<std::remove_cv_t<std::invoke_result_t<Func, U...>>>;
#else
    // Keep ::type here because we still support C++11
    template <typename Func, typename... U>
    using FunctionReturnType = typename std::remove_reference<
        typename std::remove_cv<typename std::result_of<Func(U...)>::type>::type>::type;
#endif

} // namespace Catch

namespace mpl_ {
    struct na;
}

// end catch_meta.hpp
namespace Catch {

    template <typename C> class TestInvokerAsMethod : public ITestInvoker {
        void (C::*m_testAsMethod)();

    public:
        TestInvokerAsMethod(void (C::*testAsMethod)()) noexcept : m_testAsMethod(testAsMethod) {}

        void invoke() const override {
            C obj;
            (obj.*m_testAsMethod)();
        }
    };

    auto makeTestInvoker(void (*testAsFunction)()) noexcept -> ITestInvoker*;

    template <typename C>
    auto makeTestInvoker(void (C::*testAsMethod)()) noexcept -> ITestInvoker* {
        return new (std::nothrow) TestInvokerAsMethod<C>(testAsMethod);
    }

    struct NameAndTags {
        NameAndTags(StringRef const& name_ = StringRef(),
                    StringRef const& tags_ = StringRef()) noexcept;
        StringRef name;
        StringRef tags;
    };

    struct AutoReg : NonCopyable {
        AutoReg(ITestInvoker* invoker,
                SourceLineInfo const& lineInfo,
                StringRef const& classOrMethod,
                NameAndTags const& nameAndTags) noexcept;
        ~AutoReg();
    };

} // end namespace Catch

#if defined(CATCH_CONFIG_DISABLE)
#define INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(TestName, ...) static void TestName()
#define INTERNAL_CATCH_TESTCASE_METHOD_NO_REGISTRATION(TestName, ClassName, ...)                   \
    namespace {                                                                                    \
        struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName) {                                \
            void test();                                                                           \
        };                                                                                         \
    }                                                                                              \
    void TestName::test()
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2(                                       \
    TestName, TestFunc, Name, Tags, Signature, ...)                                                \
    INTERNAL_CATCH_DEFINE_SIG_TEST(TestFunc, INTERNAL_CATCH_REMOVE_PARENS(Signature))
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2(                                \
    TestNameClass, TestName, ClassName, Name, Tags, Signature, ...)                                \
    namespace {                                                                                    \
        namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName) {                                        \
            INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD(                                                \
                TestName, ClassName, INTERNAL_CATCH_REMOVE_PARENS(Signature));                     \
        }                                                                                          \
    }                                                                                              \
    INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD(TestName, INTERNAL_CATCH_REMOVE_PARENS(Signature))

#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(Name, Tags, ...)                         \
    INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2(                                           \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____),    \
        Name,                                                                                      \
        Tags,                                                                                      \
        typename TestType,                                                                         \
        __VA_ARGS__)
#else
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(Name, Tags, ...)                         \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2(               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____),    \
        Name,                                                                                      \
        Tags,                                                                                      \
        typename TestType,                                                                         \
        __VA_ARGS__))
#endif

#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(Name, Tags, Signature, ...)          \
    INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2(                                           \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____),    \
        Name,                                                                                      \
        Tags,                                                                                      \
        Signature,                                                                                 \
        __VA_ARGS__)
#else
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(Name, Tags, Signature, ...)          \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2(               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____),    \
        Name,                                                                                      \
        Tags,                                                                                      \
        Signature,                                                                                 \
        __VA_ARGS__))
#endif

#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION(ClassName, Name, Tags, ...)       \
    INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2(                                    \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____),  \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        ClassName,                                                                                 \
        Name,                                                                                      \
        Tags,                                                                                      \
        typename T,                                                                                \
        __VA_ARGS__)
#else
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION(ClassName, Name, Tags, ...)       \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2(        \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____),  \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        ClassName,                                                                                 \
        Name,                                                                                      \
        Tags,                                                                                      \
        typename T,                                                                                \
        __VA_ARGS__))
#endif

#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION(                              \
    ClassName, Name, Tags, Signature, ...)                                                         \
    INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2(                                    \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____),  \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        ClassName,                                                                                 \
        Name,                                                                                      \
        Tags,                                                                                      \
        Signature,                                                                                 \
        __VA_ARGS__)
#else
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION(                              \
    ClassName, Name, Tags, Signature, ...)                                                         \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2(        \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____),  \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        ClassName,                                                                                 \
        Name,                                                                                      \
        Tags,                                                                                      \
        Signature,                                                                                 \
        __VA_ARGS__))
#endif
#endif

///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_TESTCASE2(TestName, ...)                                                    \
    static void TestName();                                                                        \
    CATCH_INTERNAL_START_WARNINGS_SUPPRESSION                                                      \
    CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS                                                       \
    namespace {                                                                                    \
        Catch::AutoReg                                                                             \
            INTERNAL_CATCH_UNIQUE_NAME(autoRegistrar)(Catch::makeTestInvoker(&TestName),           \
                                                      CATCH_INTERNAL_LINEINFO,                     \
                                                      Catch::StringRef(),                          \
                                                      Catch::NameAndTags{__VA_ARGS__});            \
    } /* NOLINT */                                                                                 \
    CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION                                                       \
    static void TestName()
#define INTERNAL_CATCH_TESTCASE(...)                                                               \
    INTERNAL_CATCH_TESTCASE2(INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_S_T____), __VA_ARGS__)

///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_METHOD_AS_TEST_CASE(QualifiedMethod, ...)                                   \
    CATCH_INTERNAL_START_WARNINGS_SUPPRESSION                                                      \
    CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS                                                       \
    namespace {                                                                                    \
        Catch::AutoReg                                                                             \
            INTERNAL_CATCH_UNIQUE_NAME(autoRegistrar)(Catch::makeTestInvoker(&QualifiedMethod),    \
                                                      CATCH_INTERNAL_LINEINFO,                     \
                                                      "&" #QualifiedMethod,                        \
                                                      Catch::NameAndTags{__VA_ARGS__});            \
    } /* NOLINT */                                                                                 \
    CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION

///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_TEST_CASE_METHOD2(TestName, ClassName, ...)                                 \
    CATCH_INTERNAL_START_WARNINGS_SUPPRESSION                                                      \
    CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS                                                       \
    namespace {                                                                                    \
        struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName) {                                \
            void test();                                                                           \
        };                                                                                         \
        Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME(autoRegistrar)(                                  \
            Catch::makeTestInvoker(&TestName::test),                                               \
            CATCH_INTERNAL_LINEINFO,                                                               \
            #ClassName,                                                                            \
            Catch::NameAndTags{__VA_ARGS__}); /* NOLINT */                                         \
    }                                                                                              \
    CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION                                                       \
    void TestName::test()
#define INTERNAL_CATCH_TEST_CASE_METHOD(ClassName, ...)                                            \
    INTERNAL_CATCH_TEST_CASE_METHOD2(                                                              \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_S_T____), ClassName, __VA_ARGS__)

///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_REGISTER_TESTCASE(Function, ...)                                            \
    CATCH_INTERNAL_START_WARNINGS_SUPPRESSION                                                      \
    CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS                                                       \
    Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME(autoRegistrar)(                                      \
        Catch::makeTestInvoker(Function),                                                          \
        CATCH_INTERNAL_LINEINFO,                                                                   \
        Catch::StringRef(),                                                                        \
        Catch::NameAndTags{__VA_ARGS__}); /* NOLINT */                                             \
    CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION

///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_2(TestName, TestFunc, Name, Tags, Signature, ...)        \
    CATCH_INTERNAL_START_WARNINGS_SUPPRESSION                                                      \
    CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS                                                       \
    CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS                                                 \
    CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS                                               \
    INTERNAL_CATCH_DECLARE_SIG_TEST(TestFunc, INTERNAL_CATCH_REMOVE_PARENS(Signature));            \
    namespace {                                                                                    \
        namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName) {                                        \
            INTERNAL_CATCH_TYPE_GEN                                                                \
            INTERNAL_CATCH_NTTP_GEN(INTERNAL_CATCH_REMOVE_PARENS(Signature))                       \
            INTERNAL_CATCH_NTTP_REG_GEN(TestFunc, INTERNAL_CATCH_REMOVE_PARENS(Signature))         \
            template <typename... Types> struct TestName {                                         \
                TestName() {                                                                       \
                    int index = 0;                                                                 \
                    constexpr char const* tmpl_types[] = {                                         \
                        CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, __VA_ARGS__)};     \
                    using expander = int[];                                                        \
                    (void)expander{                                                                \
                        (reg_test(Types{},                                                         \
                                  Catch::NameAndTags{Name " - " + std::string(tmpl_types[index]),  \
                                                     Tags}),                                       \
                         index++)...}; /* NOLINT */                                                \
                }                                                                                  \
            };                                                                                     \
            static int INTERNAL_CATCH_UNIQUE_NAME(globalRegistrar) = []() {                        \
                TestName<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(__VA_ARGS__)>();                \
                return 0;                                                                          \
            }();                                                                                   \
        }                                                                                          \
    }                                                                                              \
    CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION                                                       \
    INTERNAL_CATCH_DEFINE_SIG_TEST(TestFunc, INTERNAL_CATCH_REMOVE_PARENS(Signature))

#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE(Name, Tags, ...)                                         \
    INTERNAL_CATCH_TEMPLATE_TEST_CASE_2(                                                           \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____),    \
        Name,                                                                                      \
        Tags,                                                                                      \
        typename TestType,                                                                         \
        __VA_ARGS__)
#else
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE(Name, Tags, ...)                                         \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_TEST_CASE_2(                               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____),    \
        Name,                                                                                      \
        Tags,                                                                                      \
        typename TestType,                                                                         \
        __VA_ARGS__))
#endif

#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG(Name, Tags, Signature, ...)                          \
    INTERNAL_CATCH_TEMPLATE_TEST_CASE_2(                                                           \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____),    \
        Name,                                                                                      \
        Tags,                                                                                      \
        Signature,                                                                                 \
        __VA_ARGS__)
#else
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG(Name, Tags, Signature, ...)                          \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_TEST_CASE_2(                               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____),    \
        Name,                                                                                      \
        Tags,                                                                                      \
        Signature,                                                                                 \
        __VA_ARGS__))
#endif

#define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2(                                                \
    TestName, TestFuncName, Name, Tags, Signature, TmplTypes, TypesList)                           \
    CATCH_INTERNAL_START_WARNINGS_SUPPRESSION                                                      \
    CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS                                                       \
    CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS                                                 \
    CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS                                               \
    template <typename TestType> static void TestFuncName();                                       \
    namespace {                                                                                    \
        namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName) {                                        \
            INTERNAL_CATCH_TYPE_GEN                                                                \
            INTERNAL_CATCH_NTTP_GEN(INTERNAL_CATCH_REMOVE_PARENS(Signature))                       \
            template <typename... Types> struct TestName {                                         \
                void reg_tests() {                                                                 \
                    int index = 0;                                                                 \
                    using expander = int[];                                                        \
                    constexpr char const* tmpl_types[] = {                                         \
                        CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS,                    \
                                       INTERNAL_CATCH_REMOVE_PARENS(TmplTypes))};                  \
                    constexpr char const* types_list[] = {                                         \
                        CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS,                    \
                                       INTERNAL_CATCH_REMOVE_PARENS(TypesList))};                  \
                    constexpr auto num_types = sizeof(types_list) / sizeof(types_list[0]);         \
                    (void)expander{                                                                \
                        (Catch::AutoReg(Catch::makeTestInvoker(&TestFuncName<Types>),              \
                                        CATCH_INTERNAL_LINEINFO,                                   \
                                        Catch::StringRef(),                                        \
                                        Catch::NameAndTags{                                        \
                                            Name " - " +                                           \
                                                std::string(tmpl_types[index / num_types]) + "<" + \
                                                std::string(types_list[index % num_types]) + ">",  \
                                            Tags}),                                                \
                         index++)...}; /* NOLINT */                                                \
                }                                                                                  \
            };                                                                                     \
            static int INTERNAL_CATCH_UNIQUE_NAME(globalRegistrar) = []() {                        \
                using TestInit = typename create<                                                  \
                    TestName,                                                                      \
                    decltype(get_wrapper<INTERNAL_CATCH_REMOVE_PARENS(TmplTypes)>()),              \
                    TypeList<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(                            \
                        INTERNAL_CATCH_REMOVE_PARENS(TypesList))>>::type;                          \
                TestInit t;                                                                        \
                t.reg_tests();                                                                     \
                return 0;                                                                          \
            }();                                                                                   \
        }                                                                                          \
    }                                                                                              \
    CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION                                                       \
    template <typename TestType> static void TestFuncName()

#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE(Name, Tags, ...)                                 \
    INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2(                                                    \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____),    \
        Name,                                                                                      \
        Tags,                                                                                      \
        typename T,                                                                                \
        __VA_ARGS__)
#else
#define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE(Name, Tags, ...)                                 \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2(                        \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____),    \
        Name,                                                                                      \
        Tags,                                                                                      \
        typename T,                                                                                \
        __VA_ARGS__))
#endif

#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG(Name, Tags, Signature, ...)                  \
    INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2(                                                    \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____),    \
        Name,                                                                                      \
        Tags,                                                                                      \
        Signature,                                                                                 \
        __VA_ARGS__)
#else
#define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG(Name, Tags, Signature, ...)                  \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2(                        \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____),    \
        Name,                                                                                      \
        Tags,                                                                                      \
        Signature,                                                                                 \
        __VA_ARGS__))
#endif

#define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_2(TestName, TestFunc, Name, Tags, TmplList)         \
    CATCH_INTERNAL_START_WARNINGS_SUPPRESSION                                                      \
    CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS                                                       \
    CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS                                               \
    template <typename TestType> static void TestFunc();                                           \
    namespace {                                                                                    \
        namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName) {                                        \
            INTERNAL_CATCH_TYPE_GEN                                                                \
            template <typename... Types> struct TestName {                                         \
                void reg_tests() {                                                                 \
                    int index = 0;                                                                 \
                    using expander = int[];                                                        \
                    (void)expander{                                                                \
                        (Catch::AutoReg(Catch::makeTestInvoker(&TestFunc<Types>),                  \
                                        CATCH_INTERNAL_LINEINFO,                                   \
                                        Catch::StringRef(),                                        \
                                        Catch::NameAndTags{                                        \
                                            Name " - " +                                           \
                                                std::string(INTERNAL_CATCH_STRINGIZE(TmplList)) +  \
                                                " - " + std::to_string(index),                     \
                                            Tags}),                                                \
                         index++)...}; /* NOLINT */                                                \
                }                                                                                  \
            };                                                                                     \
            static int INTERNAL_CATCH_UNIQUE_NAME(globalRegistrar) = []() {                        \
                using TestInit = typename convert<TestName, TmplList>::type;                       \
                TestInit t;                                                                        \
                t.reg_tests();                                                                     \
                return 0;                                                                          \
            }();                                                                                   \
        }                                                                                          \
    }                                                                                              \
    CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION                                                       \
    template <typename TestType> static void TestFunc()

#define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE(Name, Tags, TmplList)                               \
    INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_2(                                                      \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____),    \
        Name,                                                                                      \
        Tags,                                                                                      \
        TmplList)

#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2(                                                \
    TestNameClass, TestName, ClassName, Name, Tags, Signature, ...)                                \
    CATCH_INTERNAL_START_WARNINGS_SUPPRESSION                                                      \
    CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS                                                       \
    CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS                                                 \
    CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS                                               \
    namespace {                                                                                    \
        namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName) {                                        \
            INTERNAL_CATCH_TYPE_GEN                                                                \
            INTERNAL_CATCH_NTTP_GEN(INTERNAL_CATCH_REMOVE_PARENS(Signature))                       \
            INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD(                                                \
                TestName, ClassName, INTERNAL_CATCH_REMOVE_PARENS(Signature));                     \
            INTERNAL_CATCH_NTTP_REG_METHOD_GEN(TestName, INTERNAL_CATCH_REMOVE_PARENS(Signature))  \
            template <typename... Types> struct TestNameClass {                                    \
                TestNameClass() {                                                                  \
                    int index = 0;                                                                 \
                    constexpr char const* tmpl_types[] = {                                         \
                        CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, __VA_ARGS__)};     \
                    using expander = int[];                                                        \
                    (void)expander{                                                                \
                        (reg_test(Types{},                                                         \
                                  #ClassName,                                                      \
                                  Catch::NameAndTags{Name " - " + std::string(tmpl_types[index]),  \
                                                     Tags}),                                       \
                         index++)...}; /* NOLINT */                                                \
                }                                                                                  \
            };                                                                                     \
            static int INTERNAL_CATCH_UNIQUE_NAME(globalRegistrar) = []() {                        \
                TestNameClass<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(__VA_ARGS__)>();           \
                return 0;                                                                          \
            }();                                                                                   \
        }                                                                                          \
    }                                                                                              \
    CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION                                                       \
    INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD(TestName, INTERNAL_CATCH_REMOVE_PARENS(Signature))

#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD(ClassName, Name, Tags, ...)                       \
    INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2(                                                    \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____),  \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        ClassName,                                                                                 \
        Name,                                                                                      \
        Tags,                                                                                      \
        typename T,                                                                                \
        __VA_ARGS__)
#else
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD(ClassName, Name, Tags, ...)                       \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2(                        \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____),  \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        ClassName,                                                                                 \
        Name,                                                                                      \
        Tags,                                                                                      \
        typename T,                                                                                \
        __VA_ARGS__))
#endif

#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG(ClassName, Name, Tags, Signature, ...)        \
    INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2(                                                    \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____),  \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        ClassName,                                                                                 \
        Name,                                                                                      \
        Tags,                                                                                      \
        Signature,                                                                                 \
        __VA_ARGS__)
#else
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG(ClassName, Name, Tags, Signature, ...)        \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2(                        \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____),  \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        ClassName,                                                                                 \
        Name,                                                                                      \
        Tags,                                                                                      \
        Signature,                                                                                 \
        __VA_ARGS__))
#endif

#define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2(                                        \
    TestNameClass, TestName, ClassName, Name, Tags, Signature, TmplTypes, TypesList)               \
    CATCH_INTERNAL_START_WARNINGS_SUPPRESSION                                                      \
    CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS                                                       \
    CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS                                                 \
    CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS                                               \
    template <typename TestType>                                                                   \
    struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName<TestType>) {                          \
        void test();                                                                               \
    };                                                                                             \
    namespace {                                                                                    \
        namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestNameClass) {                                   \
            INTERNAL_CATCH_TYPE_GEN                                                                \
            INTERNAL_CATCH_NTTP_GEN(INTERNAL_CATCH_REMOVE_PARENS(Signature))                       \
            template <typename... Types> struct TestNameClass {                                    \
                void reg_tests() {                                                                 \
                    int index = 0;                                                                 \
                    using expander = int[];                                                        \
                    constexpr char const* tmpl_types[] = {                                         \
                        CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS,                    \
                                       INTERNAL_CATCH_REMOVE_PARENS(TmplTypes))};                  \
                    constexpr char const* types_list[] = {                                         \
                        CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS,                    \
                                       INTERNAL_CATCH_REMOVE_PARENS(TypesList))};                  \
                    constexpr auto num_types = sizeof(types_list) / sizeof(types_list[0]);         \
                    (void)expander{                                                                \
                        (Catch::AutoReg(Catch::makeTestInvoker(&TestName<Types>::test),            \
                                        CATCH_INTERNAL_LINEINFO,                                   \
                                        #ClassName,                                                \
                                        Catch::NameAndTags{                                        \
                                            Name " - " +                                           \
                                                std::string(tmpl_types[index / num_types]) + "<" + \
                                                std::string(types_list[index % num_types]) + ">",  \
                                            Tags}),                                                \
                         index++)...}; /* NOLINT */                                                \
                }                                                                                  \
            };                                                                                     \
            static int INTERNAL_CATCH_UNIQUE_NAME(globalRegistrar) = []() {                        \
                using TestInit = typename create<                                                  \
                    TestNameClass,                                                                 \
                    decltype(get_wrapper<INTERNAL_CATCH_REMOVE_PARENS(TmplTypes)>()),              \
                    TypeList<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(                            \
                        INTERNAL_CATCH_REMOVE_PARENS(TypesList))>>::type;                          \
                TestInit t;                                                                        \
                t.reg_tests();                                                                     \
                return 0;                                                                          \
            }();                                                                                   \
        }                                                                                          \
    }                                                                                              \
    CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION                                                       \
    template <typename TestType> void TestName<TestType>::test()

#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD(ClassName, Name, Tags, ...)               \
    INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2(                                            \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____),    \
        ClassName,                                                                                 \
        Name,                                                                                      \
        Tags,                                                                                      \
        typename T,                                                                                \
        __VA_ARGS__)
#else
#define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD(ClassName, Name, Tags, ...)               \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2(                \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____),    \
        ClassName,                                                                                 \
        Name,                                                                                      \
        Tags,                                                                                      \
        typename T,                                                                                \
        __VA_ARGS__))
#endif

#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG(                                      \
    ClassName, Name, Tags, Signature, ...)                                                         \
    INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2(                                            \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____),    \
        ClassName,                                                                                 \
        Name,                                                                                      \
        Tags,                                                                                      \
        Signature,                                                                                 \
        __VA_ARGS__)
#else
#define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG(                                      \
    ClassName, Name, Tags, Signature, ...)                                                         \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2(                \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____),    \
        ClassName,                                                                                 \
        Name,                                                                                      \
        Tags,                                                                                      \
        Signature,                                                                                 \
        __VA_ARGS__))
#endif

#define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD_2(                                           \
    TestNameClass, TestName, ClassName, Name, Tags, TmplList)                                      \
    CATCH_INTERNAL_START_WARNINGS_SUPPRESSION                                                      \
    CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS                                                       \
    CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS                                               \
    template <typename TestType>                                                                   \
    struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName<TestType>) {                          \
        void test();                                                                               \
    };                                                                                             \
    namespace {                                                                                    \
        namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName) {                                        \
            INTERNAL_CATCH_TYPE_GEN                                                                \
            template <typename... Types> struct TestNameClass {                                    \
                void reg_tests() {                                                                 \
                    int index = 0;                                                                 \
                    using expander = int[];                                                        \
                    (void)expander{                                                                \
                        (Catch::AutoReg(Catch::makeTestInvoker(&TestName<Types>::test),            \
                                        CATCH_INTERNAL_LINEINFO,                                   \
                                        #ClassName,                                                \
                                        Catch::NameAndTags{                                        \
                                            Name " - " +                                           \
                                                std::string(INTERNAL_CATCH_STRINGIZE(TmplList)) +  \
                                                " - " + std::to_string(index),                     \
                                            Tags}),                                                \
                         index++)...}; /* NOLINT */                                                \
                }                                                                                  \
            };                                                                                     \
            static int INTERNAL_CATCH_UNIQUE_NAME(globalRegistrar) = []() {                        \
                using TestInit = typename convert<TestNameClass, TmplList>::type;                  \
                TestInit t;                                                                        \
                t.reg_tests();                                                                     \
                return 0;                                                                          \
            }();                                                                                   \
        }                                                                                          \
    }                                                                                              \
    CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION                                                       \
    template <typename TestType> void TestName<TestType>::test()

#define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD(ClassName, Name, Tags, TmplList)             \
    INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD_2(                                               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____),               \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____),    \
        ClassName,                                                                                 \
        Name,                                                                                      \
        Tags,                                                                                      \
        TmplList)

// end catch_test_registry.h
// start catch_capture.hpp

// start catch_assertionhandler.h

// start catch_assertioninfo.h

// start catch_result_type.h

namespace Catch {

    // ResultWas::OfType enum
    struct ResultWas {
        enum OfType {
            Unknown = -1,
            Ok = 0,
            Info = 1,
            Warning = 2,

            FailureBit = 0x10,

            ExpressionFailed = FailureBit | 1,
            ExplicitFailure = FailureBit | 2,

            Exception = 0x100 | FailureBit,

            ThrewException = Exception | 1,
            DidntThrowException = Exception | 2,

            FatalErrorCondition = 0x200 | FailureBit

        };
    };

    bool isOk(ResultWas::OfType resultType);
    bool isJustInfo(int flags);

    // ResultDisposition::Flags enum
    struct ResultDisposition {
        enum Flags {
            Normal = 0x01,

            ContinueOnFailure = 0x02, // Failures fail test, but execution continues
            FalseTest = 0x04,         // Prefix expression with !
            SuppressFail = 0x08       // Failures are reported but do not fail the test
        };
    };

    ResultDisposition::Flags operator|(ResultDisposition::Flags lhs, ResultDisposition::Flags rhs);

    bool shouldContinueOnFailure(int flags);
    inline bool isFalseTest(int flags) { return (flags & ResultDisposition::FalseTest) != 0; }
    bool shouldSuppressFailure(int flags);

} // end namespace Catch

// end catch_result_type.h
namespace Catch {

    struct AssertionInfo {
        StringRef macroName;
        SourceLineInfo lineInfo;
        StringRef capturedExpression;
        ResultDisposition::Flags resultDisposition;

        // We want to delete this constructor but a compiler bug in 4.8 means
        // the struct is then treated as non-aggregate
        // AssertionInfo() = delete;
    };

} // end namespace Catch

// end catch_assertioninfo.h
// start catch_decomposer.h

// start catch_tostring.h

#include <vector>
#include <cstddef>
#include <type_traits>
#include <string>
// start catch_stream.h

#include <iosfwd>
#include <cstddef>
#include <ostream>

namespace Catch {

    std::ostream& cout();
    std::ostream& cerr();
    std::ostream& clog();

    class StringRef;

    struct IStream {
        virtual ~IStream();
        virtual std::ostream& stream() const = 0;
    };

    auto makeStream(StringRef const& filename) -> IStream const*;

    class ReusableStringStream : NonCopyable {
        std::size_t m_index;
        std::ostream* m_oss;

    public:
        ReusableStringStream();
        ~ReusableStringStream();

        auto str() const -> std::string;

        template <typename T> auto operator<<(T const& value) -> ReusableStringStream& {
            *m_oss << value;
            return *this;
        }
        auto get() -> std::ostream& { return *m_oss; }
    };
} // namespace Catch

// end catch_stream.h
// start catch_interfaces_enum_values_registry.h

#include <vector>

namespace Catch {

    namespace Detail {
        struct EnumInfo {
            StringRef m_name;
            std::vector<std::pair<int, StringRef>> m_values;

            ~EnumInfo();

            StringRef lookup(int value) const;
        };
    } // namespace Detail

    struct IMutableEnumValuesRegistry {
        virtual ~IMutableEnumValuesRegistry();

        virtual Detail::EnumInfo const&
        registerEnum(StringRef enumName, StringRef allEnums, std::vector<int> const& values) = 0;

        template <typename E>
        Detail::EnumInfo const&
        registerEnum(StringRef enumName, StringRef allEnums, std::initializer_list<E> values) {
            static_assert(sizeof(int) >= sizeof(E), "Cannot serialize enum to int");
            std::vector<int> intValues;
            intValues.reserve(values.size());
            for (auto enumValue : values)
                intValues.push_back(static_cast<int>(enumValue));
            return registerEnum(enumName, allEnums, intValues);
        }
    };

} // namespace Catch

// end catch_interfaces_enum_values_registry.h

#ifdef CATCH_CONFIG_CPP17_STRING_VIEW
#include <string_view>
#endif

#ifdef __OBJC__
// start catch_objc_arc.hpp

#import <Foundation/Foundation.h>

#ifdef __has_feature
#define CATCH_ARC_ENABLED __has_feature(objc_arc)
#else
#define CATCH_ARC_ENABLED 0
#endif

void arcSafeRelease(NSObject* obj);
id performOptionalSelector(id obj, SEL sel);

#if !CATCH_ARC_ENABLED
inline void arcSafeRelease(NSObject* obj) { [obj release]; }
inline id performOptionalSelector(id obj, SEL sel) {
    if ([obj respondsToSelector:sel])
        return [obj performSelector:sel];
    return nil;
}
#define CATCH_UNSAFE_UNRETAINED
#define CATCH_ARC_STRONG
#else
inline void arcSafeRelease(NSObject*) {}
inline id performOptionalSelector(id obj, SEL sel) {
#ifdef __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
#endif
    if ([obj respondsToSelector:sel])
        return [obj performSelector:sel];
#ifdef __clang__
#pragma clang diagnostic pop
#endif
    return nil;
}
#define CATCH_UNSAFE_UNRETAINED __unsafe_unretained
#define CATCH_ARC_STRONG __strong
#endif

// end catch_objc_arc.hpp
#endif

#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable : 4180) // We attempt to stream a function (address) by const&,
                                // which MSVC complains about but is harmless
#endif

namespace Catch {
    namespace Detail {

        extern const std::string unprintableString;

        std::string rawMemoryToString(const void* object, std::size_t size);

        template <typename T> std::string rawMemoryToString(const T& object) {
            return rawMemoryToString(&object, sizeof(object));
        }

        template <typename T> class IsStreamInsertable {
            template <typename Stream, typename U>
            static auto test(int)
                -> decltype(std::declval<Stream&>() << std::declval<U>(), std::true_type());

            template <typename, typename> static auto test(...) -> std::false_type;

        public:
            static const bool value = decltype(test<std::ostream, const T&>(0))::value;
        };

        template <typename E> std::string convertUnknownEnumToString(E e);

        template <typename T>
        typename std::enable_if<!std::is_enum<T>::value &&
                                    !std::is_base_of<std::exception, T>::value,
                                std::string>::type
        convertUnstreamable(T const&) {
            return Detail::unprintableString;
        }
        template <typename T>
        typename std::enable_if<!std::is_enum<T>::value &&
                                    std::is_base_of<std::exception, T>::value,
                                std::string>::type
        convertUnstreamable(T const& ex) {
            return ex.what();
        }

        template <typename T>
        typename std::enable_if<std::is_enum<T>::value, std::string>::type
        convertUnstreamable(T const& value) {
            return convertUnknownEnumToString(value);
        }

#if defined(_MANAGED)
        //! Convert a CLR string to a utf8 std::string
        template <typename T> std::string clrReferenceToString(T ^ ref) {
            if (ref == nullptr)
                return std::string("null");
            auto bytes = System::Text::Encoding::UTF8->GetBytes(ref->ToString());
            cli::pin_ptr<System::Byte> p = &bytes[0];
            return std::string(reinterpret_cast<char const*>(p), bytes->Length);
        }
#endif

    } // namespace Detail

    // If we decide for C++14, change these to enable_if_ts
    template <typename T, typename = void> struct StringMaker {
        template <typename Fake = T>
        static typename std::enable_if<::Catch::Detail::IsStreamInsertable<Fake>::value,
                                       std::string>::type
        convert(const Fake& value) {
            ReusableStringStream rss;
            // NB: call using the function-like syntax to avoid ambiguity with
            // user-defined templated operator<< under clang.
            rss.operator<<(value);
            return rss.str();
        }

        template <typename Fake = T>
        static typename std::enable_if<!::Catch::Detail::IsStreamInsertable<Fake>::value,
                                       std::string>::type
        convert(const Fake& value) {
#if !defined(CATCH_CONFIG_FALLBACK_STRINGIFIER)
            return Detail::convertUnstreamable(value);
#else
            return CATCH_CONFIG_FALLBACK_STRINGIFIER(value);
#endif
        }
    };

    namespace Detail {

        // This function dispatches all stringification requests inside of
        // Catch. Should be preferably called fully qualified, like
        // ::Catch::Detail::stringify
        template <typename T> std::string stringify(const T& e) {
            return ::Catch::StringMaker<
                typename std::remove_cv<typename std::remove_reference<T>::type>::type>::convert(e);
        }

        template <typename E> std::string convertUnknownEnumToString(E e) {
            return ::Catch::Detail::stringify(
                static_cast<typename std::underlying_type<E>::type>(e));
        }

#if defined(_MANAGED)
        template <typename T> std::string stringify(T ^ e) {
            return ::Catch::StringMaker<T ^>::convert(e);
        }
#endif

    } // namespace Detail

    // Some predefined specializations

    template <> struct StringMaker<std::string> {
        static std::string convert(const std::string& str);
    };

#ifdef CATCH_CONFIG_CPP17_STRING_VIEW
    template <> struct StringMaker<std::string_view> {
        static std::string convert(std::string_view str);
    };
#endif

    template <> struct StringMaker<char const*> { static std::string convert(char const* str); };
    template <> struct StringMaker<char*> { static std::string convert(char* str); };

#ifdef CATCH_CONFIG_WCHAR
    template <> struct StringMaker<std::wstring> {
        static std::string convert(const std::wstring& wstr);
    };

#ifdef CATCH_CONFIG_CPP17_STRING_VIEW
    template <> struct StringMaker<std::wstring_view> {
        static std::string convert(std::wstring_view str);
    };
#endif

    template <> struct StringMaker<wchar_t const*> {
        static std::string convert(wchar_t const* str);
    };
    template <> struct StringMaker<wchar_t*> { static std::string convert(wchar_t* str); };
#endif

    // TBD: Should we use `strnlen` to ensure that we don't go out of the
    // buffer,
    //      while keeping string semantics?
    template <int SZ> struct StringMaker<char[SZ]> {
        static std::string convert(char const* str) {
            return ::Catch::Detail::stringify(std::string{str});
        }
    };
    template <int SZ> struct StringMaker<signed char[SZ]> {
        static std::string convert(signed char const* str) {
            return ::Catch::Detail::stringify(std::string{reinterpret_cast<char const*>(str)});
        }
    };
    template <int SZ> struct StringMaker<unsigned char[SZ]> {
        static std::string convert(unsigned char const* str) {
            return ::Catch::Detail::stringify(std::string{reinterpret_cast<char const*>(str)});
        }
    };

#if defined(CATCH_CONFIG_CPP17_BYTE)
    template <> struct StringMaker<std::byte> { static std::string convert(std::byte value); };
#endif // defined(CATCH_CONFIG_CPP17_BYTE)
    template <> struct StringMaker<int> { static std::string convert(int value); };
    template <> struct StringMaker<long> { static std::string convert(long value); };
    template <> struct StringMaker<long long> { static std::string convert(long long value); };
    template <> struct StringMaker<unsigned int> {
        static std::string convert(unsigned int value);
    };
    template <> struct StringMaker<unsigned long> {
        static std::string convert(unsigned long value);
    };
    template <> struct StringMaker<unsigned long long> {
        static std::string convert(unsigned long long value);
    };

    template <> struct StringMaker<bool> { static std::string convert(bool b); };

    template <> struct StringMaker<char> { static std::string convert(char c); };
    template <> struct StringMaker<signed char> { static std::string convert(signed char c); };
    template <> struct StringMaker<unsigned char> { static std::string convert(unsigned char c); };

    template <> struct StringMaker<std::nullptr_t> { static std::string convert(std::nullptr_t); };

    template <> struct StringMaker<float> {
        static std::string convert(float value);
        static int precision;
    };

    template <> struct StringMaker<double> {
        static std::string convert(double value);
        static int precision;
    };

    template <typename T> struct StringMaker<T*> {
        template <typename U> static std::string convert(U* p) {
            if (p) {
                return ::Catch::Detail::rawMemoryToString(p);
            } else {
                return "nullptr";
            }
        }
    };

    template <typename R, typename C> struct StringMaker<R C::*> {
        static std::string convert(R C::*p) {
            if (p) {
                return ::Catch::Detail::rawMemoryToString(p);
            } else {
                return "nullptr";
            }
        }
    };

#if defined(_MANAGED)
    template <typename T> struct StringMaker<T ^> {
        static std::string convert(T ^ ref) { return ::Catch::Detail::clrReferenceToString(ref); }
    };
#endif

    namespace Detail {
        template <typename InputIterator, typename Sentinel = InputIterator>
        std::string rangeToString(InputIterator first, Sentinel last) {
            ReusableStringStream rss;
            rss << "{ ";
            if (first != last) {
                rss << ::Catch::Detail::stringify(*first);
                for (++first; first != last; ++first)
                    rss << ", " << ::Catch::Detail::stringify(*first);
            }
            rss << " }";
            return rss.str();
        }
    } // namespace Detail

#ifdef __OBJC__
    template <> struct StringMaker<NSString*> {
        static std::string convert(NSString* nsstring) {
            if (!nsstring)
                return "nil";
            return std::string("@") + [nsstring UTF8String];
        }
    };
    template <> struct StringMaker<NSObject*> {
        static std::string convert(NSObject* nsObject) {
            return ::Catch::Detail::stringify([nsObject description]);
        }
    };
    namespace Detail {
        inline std::string stringify(NSString* nsstring) {
            return StringMaker<NSString*>::convert(nsstring);
        }

    }  // namespace Detail
#endif // __OBJC__

} // namespace Catch

//////////////////////////////////////////////////////
// Separate std-lib types stringification, so it can be selectively enabled
// This means that we do not bring in

#if defined(CATCH_CONFIG_ENABLE_ALL_STRINGMAKERS)
#define CATCH_CONFIG_ENABLE_PAIR_STRINGMAKER
#define CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER
#define CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER
#define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER
#define CATCH_CONFIG_ENABLE_OPTIONAL_STRINGMAKER
#endif

// Separate std::pair specialization
#if defined(CATCH_CONFIG_ENABLE_PAIR_STRINGMAKER)
#include <utility>
namespace Catch {
    template <typename T1, typename T2> struct StringMaker<std::pair<T1, T2>> {
        static std::string convert(const std::pair<T1, T2>& pair) {
            ReusableStringStream rss;
            rss << "{ " << ::Catch::Detail::stringify(pair.first) << ", "
                << ::Catch::Detail::stringify(pair.second) << " }";
            return rss.str();
        }
    };
} // namespace Catch
#endif // CATCH_CONFIG_ENABLE_PAIR_STRINGMAKER

#if defined(CATCH_CONFIG_ENABLE_OPTIONAL_STRINGMAKER) && defined(CATCH_CONFIG_CPP17_OPTIONAL)
#include <optional>
namespace Catch {
    template <typename T> struct StringMaker<std::optional<T>> {
        static std::string convert(const std::optional<T>& optional) {
            ReusableStringStream rss;
            if (optional.has_value()) {
                rss << ::Catch::Detail::stringify(*optional);
            } else {
                rss << "{ }";
            }
            return rss.str();
        }
    };
} // namespace Catch
#endif // CATCH_CONFIG_ENABLE_OPTIONAL_STRINGMAKER

// Separate std::tuple specialization
#if defined(CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER)
#include <tuple>
namespace Catch {
    namespace Detail {
        template <typename Tuple, std::size_t N = 0, bool = (N < std::tuple_size<Tuple>::value)>
        struct TupleElementPrinter {
            static void print(const Tuple& tuple, std::ostream& os) {
                os << (N ? ", " : " ") << ::Catch::Detail::stringify(std::get<N>(tuple));
                TupleElementPrinter<Tuple, N + 1>::print(tuple, os);
            }
        };

        template <typename Tuple, std::size_t N> struct TupleElementPrinter<Tuple, N, false> {
            static void print(const Tuple&, std::ostream&) {}
        };

    } // namespace Detail

    template <typename... Types> struct StringMaker<std::tuple<Types...>> {
        static std::string convert(const std::tuple<Types...>& tuple) {
            ReusableStringStream rss;
            rss << '{';
            Detail::TupleElementPrinter<std::tuple<Types...>>::print(tuple, rss.get());
            rss << " }";
            return rss.str();
        }
    };
} // namespace Catch
#endif // CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER

#if defined(CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER) && defined(CATCH_CONFIG_CPP17_VARIANT)
#include <variant>
namespace Catch {
    template <> struct StringMaker<std::monostate> {
        static std::string convert(const std::monostate&) { return "{ }"; }
    };

    template <typename... Elements> struct StringMaker<std::variant<Elements...>> {
        static std::string convert(const std::variant<Elements...>& variant) {
            if (variant.valueless_by_exception()) {
                return "{valueless variant}";
            } else {
                return std::visit(
                    [](const auto& value) { return ::Catch::Detail::stringify(value); }, variant);
            }
        }
    };
} // namespace Catch
#endif // CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER

namespace Catch {
    // Import begin/ end from std here
    using std::begin;
    using std::end;

    namespace detail {
        template <typename...> struct void_type { using type = void; };

        template <typename T, typename = void> struct is_range_impl : std::false_type {};

        template <typename T>
        struct is_range_impl<T, typename void_type<decltype(begin(std::declval<T>()))>::type>
            : std::true_type {};
    } // namespace detail

    template <typename T> struct is_range : detail::is_range_impl<T> {};

#if defined(_MANAGED) // Managed types are never ranges
    template <typename T> struct is_range<T ^> { static const bool value = false; };
#endif

    template <typename Range> std::string rangeToString(Range const& range) {
        return ::Catch::Detail::rangeToString(begin(range), end(range));
    }

    // Handle vector<bool> specially
    template <typename Allocator> std::string rangeToString(std::vector<bool, Allocator> const& v) {
        ReusableStringStream rss;
        rss << "{ ";
        bool first = true;
        for (bool b : v) {
            if (first)
                first = false;
            else
                rss << ", ";
            rss << ::Catch::Detail::stringify(b);
        }
        rss << " }";
        return rss.str();
    }

    template <typename R>
    struct StringMaker<
        R,
        typename std::enable_if<is_range<R>::value &&
                                !::Catch::Detail::IsStreamInsertable<R>::value>::type> {
        static std::string convert(R const& range) { return rangeToString(range); }
    };

    template <typename T, int SZ> struct StringMaker<T[SZ]> {
        static std::string convert(T const (&arr)[SZ]) { return rangeToString(arr); }
    };

} // namespace Catch

// Separate std::chrono::duration specialization
#if defined(CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER)
#include <ctime>
#include <ratio>
#include <chrono>

namespace Catch {

    template <class Ratio> struct ratio_string { static std::string symbol(); };

    template <class Ratio> std::string ratio_string<Ratio>::symbol() {
        Catch::ReusableStringStream rss;
        rss << '[' << Ratio::num << '/' << Ratio::den << ']';
        return rss.str();
    }
    template <> struct ratio_string<std::atto> { static std::string symbol(); };
    template <> struct ratio_string<std::femto> { static std::string symbol(); };
    template <> struct ratio_string<std::pico> { static std::string symbol(); };
    template <> struct ratio_string<std::nano> { static std::string symbol(); };
    template <> struct ratio_string<std::micro> { static std::string symbol(); };
    template <> struct ratio_string<std::milli> { static std::string symbol(); };

    ////////////
    // std::chrono::duration specializations
    template <typename Value, typename Ratio>
    struct StringMaker<std::chrono::duration<Value, Ratio>> {
        static std::string convert(std::chrono::duration<Value, Ratio> const& duration) {
            ReusableStringStream rss;
            rss << duration.count() << ' ' << ratio_string<Ratio>::symbol() << 's';
            return rss.str();
        }
    };
    template <typename Value> struct StringMaker<std::chrono::duration<Value, std::ratio<1>>> {
        static std::string convert(std::chrono::duration<Value, std::ratio<1>> const& duration) {
            ReusableStringStream rss;
            rss << duration.count() << " s";
            return rss.str();
        }
    };
    template <typename Value> struct StringMaker<std::chrono::duration<Value, std::ratio<60>>> {
        static std::string convert(std::chrono::duration<Value, std::ratio<60>> const& duration) {
            ReusableStringStream rss;
            rss << duration.count() << " m";
            return rss.str();
        }
    };
    template <typename Value> struct StringMaker<std::chrono::duration<Value, std::ratio<3600>>> {
        static std::string convert(std::chrono::duration<Value, std::ratio<3600>> const& duration) {
            ReusableStringStream rss;
            rss << duration.count() << " h";
            return rss.str();
        }
    };

    ////////////
    // std::chrono::time_point specialization
    // Generic time_point cannot be specialized, only
    // std::chrono::time_point<system_clock>
    template <typename Clock, typename Duration>
    struct StringMaker<std::chrono::time_point<Clock, Duration>> {
        static std::string convert(std::chrono::time_point<Clock, Duration> const& time_point) {
            return ::Catch::Detail::stringify(time_point.time_since_epoch()) + " since epoch";
        }
    };
    // std::chrono::time_point<system_clock> specialization
    template <typename Duration>
    struct StringMaker<std::chrono::time_point<std::chrono::system_clock, Duration>> {
        static std::string
        convert(std::chrono::time_point<std::chrono::system_clock, Duration> const& time_point) {
            auto converted = std::chrono::system_clock::to_time_t(time_point);

#ifdef _MSC_VER
            std::tm timeInfo = {};
            gmtime_s(&timeInfo, &converted);
#else
            std::tm* timeInfo = std::gmtime(&converted);
#endif

            auto const timeStampSize = sizeof("2017-01-16T17:06:45Z");
            char timeStamp[timeStampSize];
            const char* const fmt = "%Y-%m-%dT%H:%M:%SZ";

#ifdef _MSC_VER
            std::strftime(timeStamp, timeStampSize, fmt, &timeInfo);
#else
            std::strftime(timeStamp, timeStampSize, fmt, timeInfo);
#endif
            return std::string(timeStamp);
        }
    };
} // namespace Catch
#endif // CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER

#define INTERNAL_CATCH_REGISTER_ENUM(enumName, ...)                                                \
    namespace Catch {                                                                              \
        template <> struct StringMaker<enumName> {                                                 \
            static std::string convert(enumName value) {                                           \
                static const auto& enumInfo =                                                      \
                    ::Catch::getMutableRegistryHub().getMutableEnumValuesRegistry().registerEnum(  \
                        #enumName, #__VA_ARGS__, {__VA_ARGS__});                                   \
                return static_cast<std::string>(enumInfo.lookup(static_cast<int>(value)));         \
            }                                                                                      \
        };                                                                                         \
    }

#define CATCH_REGISTER_ENUM(enumName, ...) INTERNAL_CATCH_REGISTER_ENUM(enumName, __VA_ARGS__)

#ifdef _MSC_VER
#pragma warning(pop)
#endif

// end catch_tostring.h
#include <iosfwd>

#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable : 4389) // '==' : signed/unsigned mismatch
#pragma warning(disable : 4018) // more "signed/unsigned mismatch"
#pragma warning(disable : 4312) // Converting int to T* using reinterpret_cast
                                // (issue on x64 platform)
#pragma warning(disable : 4180) // qualifier applied to function type has no meaning
#pragma warning(disable : 4800) // Forcing result to true or false
#endif

namespace Catch {

    struct ITransientExpression {
        auto isBinaryExpression() const -> bool { return m_isBinaryExpression; }
        auto getResult() const -> bool { return m_result; }
        virtual void streamReconstructedExpression(std::ostream& os) const = 0;

        ITransientExpression(bool isBinaryExpression, bool result) :
            m_isBinaryExpression(isBinaryExpression), m_result(result) {}

        // We don't actually need a virtual destructor, but many static
        // analysers complain if it's not here :-(
        virtual ~ITransientExpression();

        bool m_isBinaryExpression;
        bool m_result;
    };

    void formatReconstructedExpression(std::ostream& os,
                                       std::string const& lhs,
                                       StringRef op,
                                       std::string const& rhs);

    template <typename LhsT, typename RhsT> class BinaryExpr : public ITransientExpression {
        LhsT m_lhs;
        StringRef m_op;
        RhsT m_rhs;

        void streamReconstructedExpression(std::ostream& os) const override {
            formatReconstructedExpression(
                os, Catch::Detail::stringify(m_lhs), m_op, Catch::Detail::stringify(m_rhs));
        }

    public:
        BinaryExpr(bool comparisonResult, LhsT lhs, StringRef op, RhsT rhs) :
            ITransientExpression{true, comparisonResult}, m_lhs(lhs), m_op(op), m_rhs(rhs) {}

        template <typename T> auto operator&&(T) const -> BinaryExpr<LhsT, RhsT const&> const {
            static_assert(always_false<T>::value,
                          "chained comparisons are not supported inside assertions, "
                          "wrap the expression inside parentheses, or decompose it");
        }

        template <typename T> auto operator||(T) const -> BinaryExpr<LhsT, RhsT const&> const {
            static_assert(always_false<T>::value,
                          "chained comparisons are not supported inside assertions, "
                          "wrap the expression inside parentheses, or decompose it");
        }

        template <typename T> auto operator==(T) const -> BinaryExpr<LhsT, RhsT const&> const {
            static_assert(always_false<T>::value,
                          "chained comparisons are not supported inside assertions, "
                          "wrap the expression inside parentheses, or decompose it");
        }

        template <typename T> auto operator!=(T) const -> BinaryExpr<LhsT, RhsT const&> const {
            static_assert(always_false<T>::value,
                          "chained comparisons are not supported inside assertions, "
                          "wrap the expression inside parentheses, or decompose it");
        }

        template <typename T> auto operator>(T) const -> BinaryExpr<LhsT, RhsT const&> const {
            static_assert(always_false<T>::value,
                          "chained comparisons are not supported inside assertions, "
                          "wrap the expression inside parentheses, or decompose it");
        }

        template <typename T> auto operator<(T) const -> BinaryExpr<LhsT, RhsT const&> const {
            static_assert(always_false<T>::value,
                          "chained comparisons are not supported inside assertions, "
                          "wrap the expression inside parentheses, or decompose it");
        }

        template <typename T> auto operator>=(T) const -> BinaryExpr<LhsT, RhsT const&> const {
            static_assert(always_false<T>::value,
                          "chained comparisons are not supported inside assertions, "
                          "wrap the expression inside parentheses, or decompose it");
        }

        template <typename T> auto operator<=(T) const -> BinaryExpr<LhsT, RhsT const&> const {
            static_assert(always_false<T>::value,
                          "chained comparisons are not supported inside assertions, "
                          "wrap the expression inside parentheses, or decompose it");
        }
    };

    template <typename LhsT> class UnaryExpr : public ITransientExpression {
        LhsT m_lhs;

        void streamReconstructedExpression(std::ostream& os) const override {
            os << Catch::Detail::stringify(m_lhs);
        }

    public:
        explicit UnaryExpr(LhsT lhs) :
            ITransientExpression{false, static_cast<bool>(lhs)}, m_lhs(lhs) {}
    };

    // Specialised comparison functions to handle equality comparisons between
    // ints and pointers (NULL deduces as an int)
    template <typename LhsT, typename RhsT>
    auto compareEqual(LhsT const& lhs, RhsT const& rhs) -> bool {
        return static_cast<bool>(lhs == rhs);
    }
    template <typename T> auto compareEqual(T* const& lhs, int rhs) -> bool {
        return lhs == reinterpret_cast<void const*>(rhs);
    }
    template <typename T> auto compareEqual(T* const& lhs, long rhs) -> bool {
        return lhs == reinterpret_cast<void const*>(rhs);
    }
    template <typename T> auto compareEqual(int lhs, T* const& rhs) -> bool {
        return reinterpret_cast<void const*>(lhs) == rhs;
    }
    template <typename T> auto compareEqual(long lhs, T* const& rhs) -> bool {
        return reinterpret_cast<void const*>(lhs) == rhs;
    }

    template <typename LhsT, typename RhsT>
    auto compareNotEqual(LhsT const& lhs, RhsT&& rhs) -> bool {
        return static_cast<bool>(lhs != rhs);
    }
    template <typename T> auto compareNotEqual(T* const& lhs, int rhs) -> bool {
        return lhs != reinterpret_cast<void const*>(rhs);
    }
    template <typename T> auto compareNotEqual(T* const& lhs, long rhs) -> bool {
        return lhs != reinterpret_cast<void const*>(rhs);
    }
    template <typename T> auto compareNotEqual(int lhs, T* const& rhs) -> bool {
        return reinterpret_cast<void const*>(lhs) != rhs;
    }
    template <typename T> auto compareNotEqual(long lhs, T* const& rhs) -> bool {
        return reinterpret_cast<void const*>(lhs) != rhs;
    }

    template <typename LhsT> class ExprLhs {
        LhsT m_lhs;

    public:
        explicit ExprLhs(LhsT lhs) : m_lhs(lhs) {}

        template <typename RhsT>
        auto operator==(RhsT const& rhs) -> BinaryExpr<LhsT, RhsT const&> const {
            return {compareEqual(m_lhs, rhs), m_lhs, "==", rhs};
        }
        auto operator==(bool rhs) -> BinaryExpr<LhsT, bool> const {
            return {m_lhs == rhs, m_lhs, "==", rhs};
        }

        template <typename RhsT>
        auto operator!=(RhsT const& rhs) -> BinaryExpr<LhsT, RhsT const&> const {
            return {compareNotEqual(m_lhs, rhs), m_lhs, "!=", rhs};
        }
        auto operator!=(bool rhs) -> BinaryExpr<LhsT, bool> const {
            return {m_lhs != rhs, m_lhs, "!=", rhs};
        }

        template <typename RhsT>
        auto operator>(RhsT const& rhs) -> BinaryExpr<LhsT, RhsT const&> const {
            return {static_cast<bool>(m_lhs > rhs), m_lhs, ">", rhs};
        }
        template <typename RhsT>
        auto operator<(RhsT const& rhs) -> BinaryExpr<LhsT, RhsT const&> const {
            return {static_cast<bool>(m_lhs < rhs), m_lhs, "<", rhs};
        }
        template <typename RhsT>
        auto operator>=(RhsT const& rhs) -> BinaryExpr<LhsT, RhsT const&> const {
            return {static_cast<bool>(m_lhs >= rhs), m_lhs, ">=", rhs};
        }
        template <typename RhsT>
        auto operator<=(RhsT const& rhs) -> BinaryExpr<LhsT, RhsT const&> const {
            return {static_cast<bool>(m_lhs <= rhs), m_lhs, "<=", rhs};
        }
        template <typename RhsT>
        auto operator|(RhsT const& rhs) -> BinaryExpr<LhsT, RhsT const&> const {
            return {static_cast<bool>(m_lhs | rhs), m_lhs, "|", rhs};
        }
        template <typename RhsT>
        auto operator&(RhsT const& rhs) -> BinaryExpr<LhsT, RhsT const&> const {
            return {static_cast<bool>(m_lhs & rhs), m_lhs, "&", rhs};
        }
        template <typename RhsT>
        auto operator^(RhsT const& rhs) -> BinaryExpr<LhsT, RhsT const&> const {
            return {static_cast<bool>(m_lhs ^ rhs), m_lhs, "^", rhs};
        }

        template <typename RhsT>
        auto operator&&(RhsT const&) -> BinaryExpr<LhsT, RhsT const&> const {
            static_assert(always_false<RhsT>::value,
                          "operator&& is not supported inside assertions, "
                          "wrap the expression inside parentheses, or decompose it");
        }

        template <typename RhsT>
        auto operator||(RhsT const&) -> BinaryExpr<LhsT, RhsT const&> const {
            static_assert(always_false<RhsT>::value,
                          "operator|| is not supported inside assertions, "
                          "wrap the expression inside parentheses, or decompose it");
        }

        auto makeUnaryExpr() const -> UnaryExpr<LhsT> { return UnaryExpr<LhsT>{m_lhs}; }
    };

    void handleExpression(ITransientExpression const& expr);

    template <typename T> void handleExpression(ExprLhs<T> const& expr) {
        handleExpression(expr.makeUnaryExpr());
    }

    struct Decomposer {
        template <typename T> auto operator<=(T const& lhs) -> ExprLhs<T const&> {
            return ExprLhs<T const&>{lhs};
        }

        auto operator<=(bool value) -> ExprLhs<bool> { return ExprLhs<bool>{value}; }
    };

} // end namespace Catch

#ifdef _MSC_VER
#pragma warning(pop)
#endif

// end catch_decomposer.h
// start catch_interfaces_capture.h

#include <string>
#include <chrono>

namespace Catch {

    class AssertionResult;
    struct AssertionInfo;
    struct SectionInfo;
    struct SectionEndInfo;
    struct MessageInfo;
    struct MessageBuilder;
    struct Counts;
    struct AssertionReaction;
    struct SourceLineInfo;

    struct ITransientExpression;
    struct IGeneratorTracker;

#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
    struct BenchmarkInfo;
    template <typename Duration = std::chrono::duration<double, std::nano>> struct BenchmarkStats;
#endif // CATCH_CONFIG_ENABLE_BENCHMARKING

    struct IResultCapture {

        virtual ~IResultCapture();

        virtual bool sectionStarted(SectionInfo const& sectionInfo, Counts& assertions) = 0;
        virtual void sectionEnded(SectionEndInfo const& endInfo) = 0;
        virtual void sectionEndedEarly(SectionEndInfo const& endInfo) = 0;

        virtual auto acquireGeneratorTracker(StringRef generatorName,
                                             SourceLineInfo const& lineInfo)
            -> IGeneratorTracker& = 0;

#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
        virtual void benchmarkPreparing(std::string const& name) = 0;
        virtual void benchmarkStarting(BenchmarkInfo const& info) = 0;
        virtual void benchmarkEnded(BenchmarkStats<> const& stats) = 0;
        virtual void benchmarkFailed(std::string const& error) = 0;
#endif // CATCH_CONFIG_ENABLE_BENCHMARKING

        virtual void pushScopedMessage(MessageInfo const& message) = 0;
        virtual void popScopedMessage(MessageInfo const& message) = 0;

        virtual void emplaceUnscopedMessage(MessageBuilder const& builder) = 0;

        virtual void handleFatalErrorCondition(StringRef message) = 0;

        virtual void handleExpr(AssertionInfo const& info,
                                ITransientExpression const& expr,
                                AssertionReaction& reaction) = 0;
        virtual void handleMessage(AssertionInfo const& info,
                                   ResultWas::OfType resultType,
                                   StringRef const& message,
                                   AssertionReaction& reaction) = 0;
        virtual void handleUnexpectedExceptionNotThrown(AssertionInfo const& info,
                                                        AssertionReaction& reaction) = 0;
        virtual void handleUnexpectedInflightException(AssertionInfo const& info,
                                                       std::string const& message,
                                                       AssertionReaction& reaction) = 0;
        virtual void handleIncomplete(AssertionInfo const& info) = 0;
        virtual void handleNonExpr(AssertionInfo const& info,
                                   ResultWas::OfType resultType,
                                   AssertionReaction& reaction) = 0;

        virtual bool lastAssertionPassed() = 0;
        virtual void assertionPassed() = 0;

        // Deprecated, do not use:
        virtual std::string getCurrentTestName() const = 0;
        virtual const AssertionResult* getLastResult() const = 0;
        virtual void exceptionEarlyReported() = 0;
    };

    IResultCapture& getResultCapture();
} // namespace Catch

// end catch_interfaces_capture.h
namespace Catch {

    struct TestFailureException {};
    struct AssertionResultData;
    struct IResultCapture;
    class RunContext;

    class LazyExpression {
        friend class AssertionHandler;
        friend struct AssertionStats;
        friend class RunContext;

        ITransientExpression const* m_transientExpression = nullptr;
        bool m_isNegated;

    public:
        LazyExpression(bool isNegated);
        LazyExpression(LazyExpression const& other);
        LazyExpression& operator=(LazyExpression const&) = delete;

        explicit operator bool() const;

        friend auto operator<<(std::ostream& os, LazyExpression const& lazyExpr) -> std::ostream&;
    };

    struct AssertionReaction {
        bool shouldDebugBreak = false;
        bool shouldThrow = false;
    };

    class AssertionHandler {
        AssertionInfo m_assertionInfo;
        AssertionReaction m_reaction;
        bool m_completed = false;
        IResultCapture& m_resultCapture;

    public:
        AssertionHandler(StringRef const& macroName,
                         SourceLineInfo const& lineInfo,
                         StringRef capturedExpression,
                         ResultDisposition::Flags resultDisposition);
        ~AssertionHandler() {
            if (!m_completed) {
                m_resultCapture.handleIncomplete(m_assertionInfo);
            }
        }

        template <typename T> void handleExpr(ExprLhs<T> const& expr) {
            handleExpr(expr.makeUnaryExpr());
        }
        void handleExpr(ITransientExpression const& expr);

        void handleMessage(ResultWas::OfType resultType, StringRef const& message);

        void handleExceptionThrownAsExpected();
        void handleUnexpectedExceptionNotThrown();
        void handleExceptionNotThrownAsExpected();
        void handleThrowingCallSkipped();
        void handleUnexpectedInflightException();

        void complete();
        void setCompleted();

        // query
        auto allowThrows() const -> bool;
    };

    void handleExceptionMatchExpr(AssertionHandler& handler,
                                  std::string const& str,
                                  StringRef const& matcherString);

} // namespace Catch

// end catch_assertionhandler.h
// start catch_message.h

#include <string>
#include <vector>

namespace Catch {

    struct MessageInfo {
        MessageInfo(StringRef const& _macroName,
                    SourceLineInfo const& _lineInfo,
                    ResultWas::OfType _type);

        StringRef macroName;
        std::string message;
        SourceLineInfo lineInfo;
        ResultWas::OfType type;
        unsigned int sequence;

        bool operator==(MessageInfo const& other) const;
        bool operator<(MessageInfo const& other) const;

    private:
        static unsigned int globalCount;
    };

    struct MessageStream {

        template <typename T> MessageStream& operator<<(T const& value) {
            m_stream << value;
            return *this;
        }

        ReusableStringStream m_stream;
    };

    struct MessageBuilder : MessageStream {
        MessageBuilder(StringRef const& macroName,
                       SourceLineInfo const& lineInfo,
                       ResultWas::OfType type);

        template <typename T> MessageBuilder& operator<<(T const& value) {
            m_stream << value;
            return *this;
        }

        MessageInfo m_info;
    };

    class ScopedMessage {
    public:
        explicit ScopedMessage(MessageBuilder const& builder);
        ScopedMessage(ScopedMessage& duplicate) = delete;
        ScopedMessage(ScopedMessage&& old);
        ~ScopedMessage();

        MessageInfo m_info;
        bool m_moved;
    };

    class Capturer {
        std::vector<MessageInfo> m_messages;
        IResultCapture& m_resultCapture = getResultCapture();
        size_t m_captured = 0;

    public:
        Capturer(StringRef macroName,
                 SourceLineInfo const& lineInfo,
                 ResultWas::OfType resultType,
                 StringRef names);
        ~Capturer();

        void captureValue(size_t index, std::string const& value);

        template <typename T> void captureValues(size_t index, T const& value) {
            captureValue(index, Catch::Detail::stringify(value));
        }

        template <typename T, typename... Ts>
        void captureValues(size_t index, T const& value, Ts const&... values) {
            captureValue(index, Catch::Detail::stringify(value));
            captureValues(index + 1, values...);
        }
    };

} // end namespace Catch

// end catch_message.h
#if !defined(CATCH_CONFIG_DISABLE)

#if !defined(CATCH_CONFIG_DISABLE_STRINGIFICATION)
#define CATCH_INTERNAL_STRINGIFY(...) #__VA_ARGS__
#else
#define CATCH_INTERNAL_STRINGIFY(...) "Disabled by CATCH_CONFIG_DISABLE_STRINGIFICATION"
#endif

#if defined(CATCH_CONFIG_FAST_COMPILE) || defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)

///////////////////////////////////////////////////////////////////////////////
// Another way to speed-up compilation is to omit local try-catch for REQUIRE*
// macros.
#define INTERNAL_CATCH_TRY
#define INTERNAL_CATCH_CATCH(capturer)

#else // CATCH_CONFIG_FAST_COMPILE

#define INTERNAL_CATCH_TRY try
#define INTERNAL_CATCH_CATCH(handler)                                                              \
    catch (...) {                                                                                  \
        handler.handleUnexpectedInflightException();                                               \
    }

#endif

#define INTERNAL_CATCH_REACT(handler) handler.complete();

///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_TEST(macroName, resultDisposition, ...)                                     \
    do {                                                                                           \
        CATCH_INTERNAL_IGNORE_BUT_WARN(__VA_ARGS__);                                               \
        Catch::AssertionHandler catchAssertionHandler(macroName##_catch_sr,                        \
                                                      CATCH_INTERNAL_LINEINFO,                     \
                                                      CATCH_INTERNAL_STRINGIFY(__VA_ARGS__),       \
                                                      resultDisposition);                          \
        INTERNAL_CATCH_TRY {                                                                       \
            CATCH_INTERNAL_START_WARNINGS_SUPPRESSION                                              \
            CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS                                           \
            catchAssertionHandler.handleExpr(Catch::Decomposer() <= __VA_ARGS__);                  \
            CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION                                               \
        }                                                                                          \
        INTERNAL_CATCH_CATCH(catchAssertionHandler)                                                \
        INTERNAL_CATCH_REACT(catchAssertionHandler)                                                \
    } while ((void)0, (false) && static_cast<bool>(!!(__VA_ARGS__)))

///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_IF(macroName, resultDisposition, ...)                                       \
    INTERNAL_CATCH_TEST(macroName, resultDisposition, __VA_ARGS__);                                \
    if (Catch::getResultCapture().lastAssertionPassed())

///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_ELSE(macroName, resultDisposition, ...)                                     \
    INTERNAL_CATCH_TEST(macroName, resultDisposition, __VA_ARGS__);                                \
    if (!Catch::getResultCapture().lastAssertionPassed())

///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_NO_THROW(macroName, resultDisposition, ...)                                 \
    do {                                                                                           \
        Catch::AssertionHandler catchAssertionHandler(macroName##_catch_sr,                        \
                                                      CATCH_INTERNAL_LINEINFO,                     \
                                                      CATCH_INTERNAL_STRINGIFY(__VA_ARGS__),       \
                                                      resultDisposition);                          \
        try {                                                                                      \
            static_cast<void>(__VA_ARGS__);                                                        \
            catchAssertionHandler.handleExceptionNotThrownAsExpected();                            \
        } catch (...) {                                                                            \
            catchAssertionHandler.handleUnexpectedInflightException();                             \
        }                                                                                          \
        INTERNAL_CATCH_REACT(catchAssertionHandler)                                                \
    } while (false)

///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_THROWS(macroName, resultDisposition, ...)                                   \
    do {                                                                                           \
        Catch::AssertionHandler catchAssertionHandler(macroName##_catch_sr,                        \
                                                      CATCH_INTERNAL_LINEINFO,                     \
                                                      CATCH_INTERNAL_STRINGIFY(__VA_ARGS__),       \
                                                      resultDisposition);                          \
        if (catchAssertionHandler.allowThrows())                                                   \
            try {                                                                                  \
                static_cast<void>(__VA_ARGS__);                                                    \
                catchAssertionHandler.handleUnexpectedExceptionNotThrown();                        \
            } catch (...) {                                                                        \
                catchAssertionHandler.handleExceptionThrownAsExpected();                           \
            }                                                                                      \
        else                                                                                       \
            catchAssertionHandler.handleThrowingCallSkipped();                                     \
        INTERNAL_CATCH_REACT(catchAssertionHandler)                                                \
    } while (false)

///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_THROWS_AS(macroName, exceptionType, resultDisposition, expr)                \
    do {                                                                                           \
        Catch::AssertionHandler catchAssertionHandler(                                             \
            macroName##_catch_sr,                                                                  \
            CATCH_INTERNAL_LINEINFO,                                                               \
            CATCH_INTERNAL_STRINGIFY(expr) ", " CATCH_INTERNAL_STRINGIFY(exceptionType),           \
            resultDisposition);                                                                    \
        if (catchAssertionHandler.allowThrows())                                                   \
            try {                                                                                  \
                static_cast<void>(expr);                                                           \
                catchAssertionHandler.handleUnexpectedExceptionNotThrown();                        \
            } catch (exceptionType const&) {                                                       \
                catchAssertionHandler.handleExceptionThrownAsExpected();                           \
            } catch (...) {                                                                        \
                catchAssertionHandler.handleUnexpectedInflightException();                         \
            }                                                                                      \
        else                                                                                       \
            catchAssertionHandler.handleThrowingCallSkipped();                                     \
        INTERNAL_CATCH_REACT(catchAssertionHandler)                                                \
    } while (false)

///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_MSG(macroName, messageType, resultDisposition, ...)                         \
    do {                                                                                           \
        Catch::AssertionHandler catchAssertionHandler(                                             \
            macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, Catch::StringRef(), resultDisposition); \
        catchAssertionHandler.handleMessage(                                                       \
            messageType,                                                                           \
            (Catch::MessageStream() << __VA_ARGS__ + ::Catch::StreamEndStop()).m_stream.str());    \
        INTERNAL_CATCH_REACT(catchAssertionHandler)                                                \
    } while (false)

///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_CAPTURE(varName, macroName, ...)                                            \
    auto varName =                                                                                 \
        Catch::Capturer(macroName, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info, #__VA_ARGS__); \
    varName.captureValues(0, __VA_ARGS__)

///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_INFO(macroName, log)                                                        \
    Catch::ScopedMessage INTERNAL_CATCH_UNIQUE_NAME(scopedMessage)(                                \
        Catch::MessageBuilder(                                                                     \
            macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info)                 \
        << log);

///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_UNSCOPED_INFO(macroName, log)                                               \
    Catch::getResultCapture().emplaceUnscopedMessage(                                              \
        Catch::MessageBuilder(                                                                     \
            macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info)                 \
        << log)

///////////////////////////////////////////////////////////////////////////////
// Although this is matcher-based, it can be used with just a string
#define INTERNAL_CATCH_THROWS_STR_MATCHES(macroName, resultDisposition, matcher, ...)              \
    do {                                                                                           \
        Catch::AssertionHandler catchAssertionHandler(                                             \
            macroName##_catch_sr,                                                                  \
            CATCH_INTERNAL_LINEINFO,                                                               \
            CATCH_INTERNAL_STRINGIFY(__VA_ARGS__) ", " CATCH_INTERNAL_STRINGIFY(matcher),          \
            resultDisposition);                                                                    \
        if (catchAssertionHandler.allowThrows())                                                   \
            try {                                                                                  \
                static_cast<void>(__VA_ARGS__);                                                    \
                catchAssertionHandler.handleUnexpectedExceptionNotThrown();                        \
            } catch (...) {                                                                        \
                Catch::handleExceptionMatchExpr(                                                   \
                    catchAssertionHandler, matcher, #matcher##_catch_sr);                          \
            }                                                                                      \
        else                                                                                       \
            catchAssertionHandler.handleThrowingCallSkipped();                                     \
        INTERNAL_CATCH_REACT(catchAssertionHandler)                                                \
    } while (false)

#endif // CATCH_CONFIG_DISABLE

// end catch_capture.hpp
// start catch_section.h

// start catch_section_info.h

// start catch_totals.h

#include <cstddef>

namespace Catch {

    struct Counts {
        Counts operator-(Counts const& other) const;
        Counts& operator+=(Counts const& other);

        std::size_t total() const;
        bool allPassed() const;
        bool allOk() const;

        std::size_t passed = 0;
        std::size_t failed = 0;
        std::size_t failedButOk = 0;
    };

    struct Totals {

        Totals operator-(Totals const& other) const;
        Totals& operator+=(Totals const& other);

        Totals delta(Totals const& prevTotals) const;

        int error = 0;
        Counts assertions;
        Counts testCases;
    };
} // namespace Catch

// end catch_totals.h
#include <string>

namespace Catch {

    struct SectionInfo {
        SectionInfo(SourceLineInfo const& _lineInfo, std::string const& _name);

        // Deprecated
        SectionInfo(SourceLineInfo const& _lineInfo, std::string const& _name, std::string const&) :
            SectionInfo(_lineInfo, _name) {}

        std::string name;
        std::string description; // !Deprecated: this will always be empty
        SourceLineInfo lineInfo;
    };

    struct SectionEndInfo {
        SectionInfo sectionInfo;
        Counts prevAssertions;
        double durationInSeconds;
    };

} // end namespace Catch

// end catch_section_info.h
// start catch_timer.h

#include <cstdint>

namespace Catch {

    auto getCurrentNanosecondsSinceEpoch() -> uint64_t;
    auto getEstimatedClockResolution() -> uint64_t;

    class Timer {
        uint64_t m_nanoseconds = 0;

    public:
        void start();
        auto getElapsedNanoseconds() const -> uint64_t;
        auto getElapsedMicroseconds() const -> uint64_t;
        auto getElapsedMilliseconds() const -> unsigned int;
        auto getElapsedSeconds() const -> double;
    };

} // namespace Catch

// end catch_timer.h
#include <string>

namespace Catch {

    class Section : NonCopyable {
    public:
        Section(SectionInfo const& info);
        ~Section();

        // This indicates whether the section should be executed or not
        explicit operator bool() const;

    private:
        SectionInfo m_info;

        std::string m_name;
        Counts m_assertions;
        bool m_sectionIncluded;
        Timer m_timer;
    };

} // end namespace Catch

#define INTERNAL_CATCH_SECTION(...)                                                                \
    CATCH_INTERNAL_START_WARNINGS_SUPPRESSION                                                      \
    CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS                                                        \
    if (Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME(catch_internal_Section) =                 \
            Catch::SectionInfo(CATCH_INTERNAL_LINEINFO, __VA_ARGS__))                              \
    CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION

#define INTERNAL_CATCH_DYNAMIC_SECTION(...)                                                        \
    CATCH_INTERNAL_START_WARNINGS_SUPPRESSION                                                      \
    CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS                                                        \
    if (Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME(catch_internal_Section) =                 \
            Catch::SectionInfo(CATCH_INTERNAL_LINEINFO,                                            \
                               (Catch::ReusableStringStream() << __VA_ARGS__).str()))              \
    CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION

// end catch_section.h
// start catch_interfaces_exception.h

// start catch_interfaces_registry_hub.h

#include <string>
#include <memory>

namespace Catch {

    class TestCase;
    struct ITestCaseRegistry;
    struct IExceptionTranslatorRegistry;
    struct IExceptionTranslator;
    struct IReporterRegistry;
    struct IReporterFactory;
    struct ITagAliasRegistry;
    struct IMutableEnumValuesRegistry;

    class StartupExceptionRegistry;

    using IReporterFactoryPtr = std::shared_ptr<IReporterFactory>;

    struct IRegistryHub {
        virtual ~IRegistryHub();

        virtual IReporterRegistry const& getReporterRegistry() const = 0;
        virtual ITestCaseRegistry const& getTestCaseRegistry() const = 0;
        virtual ITagAliasRegistry const& getTagAliasRegistry() const = 0;
        virtual IExceptionTranslatorRegistry const& getExceptionTranslatorRegistry() const = 0;

        virtual StartupExceptionRegistry const& getStartupExceptionRegistry() const = 0;
    };

    struct IMutableRegistryHub {
        virtual ~IMutableRegistryHub();
        virtual void registerReporter(std::string const& name,
                                      IReporterFactoryPtr const& factory) = 0;
        virtual void registerListener(IReporterFactoryPtr const& factory) = 0;
        virtual void registerTest(TestCase const& testInfo) = 0;
        virtual void registerTranslator(const IExceptionTranslator* translator) = 0;
        virtual void registerTagAlias(std::string const& alias,
                                      std::string const& tag,
                                      SourceLineInfo const& lineInfo) = 0;
        virtual void registerStartupException() noexcept = 0;
        virtual IMutableEnumValuesRegistry& getMutableEnumValuesRegistry() = 0;
    };

    IRegistryHub const& getRegistryHub();
    IMutableRegistryHub& getMutableRegistryHub();
    void cleanUp();
    std::string translateActiveException();

} // namespace Catch

// end catch_interfaces_registry_hub.h
#if defined(CATCH_CONFIG_DISABLE)
#define INTERNAL_CATCH_TRANSLATE_EXCEPTION_NO_REG(translatorName, signature)                       \
    static std::string translatorName(signature)
#endif

#include <exception>
#include <string>
#include <vector>

namespace Catch {
    using exceptionTranslateFunction = std::string (*)();

    struct IExceptionTranslator;
    using ExceptionTranslators = std::vector<std::unique_ptr<IExceptionTranslator const>>;

    struct IExceptionTranslator {
        virtual ~IExceptionTranslator();
        virtual std::string translate(ExceptionTranslators::const_iterator it,
                                      ExceptionTranslators::const_iterator itEnd) const = 0;
    };

    struct IExceptionTranslatorRegistry {
        virtual ~IExceptionTranslatorRegistry();

        virtual std::string translateActiveException() const = 0;
    };

    class ExceptionTranslatorRegistrar {
        template <typename T> class ExceptionTranslator : public IExceptionTranslator {
        public:
            ExceptionTranslator(std::string (*translateFunction)(T&)) :
                m_translateFunction(translateFunction) {}

            std::string translate(ExceptionTranslators::const_iterator it,
                                  ExceptionTranslators::const_iterator itEnd) const override {
#if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
                return "";
#else
                try {
                    if (it == itEnd)
                        std::rethrow_exception(std::current_exception());
                    else
                        return (*it)->translate(it + 1, itEnd);
                } catch (T& ex) {
                    return m_translateFunction(ex);
                }
#endif
            }

        protected:
            std::string (*m_translateFunction)(T&);
        };

    public:
        template <typename T> ExceptionTranslatorRegistrar(std::string (*translateFunction)(T&)) {
            getMutableRegistryHub().registerTranslator(
                new ExceptionTranslator<T>(translateFunction));
        }
    };
} // namespace Catch

///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_TRANSLATE_EXCEPTION2(translatorName, signature)                             \
    static std::string translatorName(signature);                                                  \
    CATCH_INTERNAL_START_WARNINGS_SUPPRESSION                                                      \
    CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS                                                       \
    namespace {                                                                                    \
        Catch::ExceptionTranslatorRegistrar                                                        \
            INTERNAL_CATCH_UNIQUE_NAME(catch_internal_ExceptionRegistrar)(&translatorName);        \
    }                                                                                              \
    CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION                                                       \
    static std::string translatorName(signature)

#define INTERNAL_CATCH_TRANSLATE_EXCEPTION(signature)                                              \
    INTERNAL_CATCH_TRANSLATE_EXCEPTION2(                                                           \
        INTERNAL_CATCH_UNIQUE_NAME(catch_internal_ExceptionTranslator), signature)

// end catch_interfaces_exception.h
// start catch_approx.h

#include <type_traits>

namespace Catch {
    namespace Detail {

        class Approx {
        private:
            bool equalityComparisonImpl(double other) const;
            // Validates the new margin (margin >= 0)
            // out-of-line to avoid including stdexcept in the header
            void setMargin(double margin);
            // Validates the new epsilon (0 < epsilon < 1)
            // out-of-line to avoid including stdexcept in the header
            void setEpsilon(double epsilon);

        public:
            explicit Approx(double value);

            static Approx custom();

            Approx operator-() const;

            template <
                typename T,
                typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
            Approx operator()(T const& value) {
                Approx approx(static_cast<double>(value));
                approx.m_epsilon = m_epsilon;
                approx.m_margin = m_margin;
                approx.m_scale = m_scale;
                return approx;
            }

            template <
                typename T,
                typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
            explicit Approx(T const& value) : Approx(static_cast<double>(value)) {}

            template <
                typename T,
                typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
            friend bool operator==(const T& lhs, Approx const& rhs) {
                auto lhs_v = static_cast<double>(lhs);
                return rhs.equalityComparisonImpl(lhs_v);
            }

            template <
                typename T,
                typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
            friend bool operator==(Approx const& lhs, const T& rhs) {
                return operator==(rhs, lhs);
            }

            template <
                typename T,
                typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
            friend bool operator!=(T const& lhs, Approx const& rhs) {
                return !operator==(lhs, rhs);
            }

            template <
                typename T,
                typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
            friend bool operator!=(Approx const& lhs, T const& rhs) {
                return !operator==(rhs, lhs);
            }

            template <
                typename T,
                typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
            friend bool operator<=(T const& lhs, Approx const& rhs) {
                return static_cast<double>(lhs) < rhs.m_value || lhs == rhs;
            }

            template <
                typename T,
                typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
            friend bool operator<=(Approx const& lhs, T const& rhs) {
                return lhs.m_value < static_cast<double>(rhs) || lhs == rhs;
            }

            template <
                typename T,
                typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
            friend bool operator>=(T const& lhs, Approx const& rhs) {
                return static_cast<double>(lhs) > rhs.m_value || lhs == rhs;
            }

            template <
                typename T,
                typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
            friend bool operator>=(Approx const& lhs, T const& rhs) {
                return lhs.m_value > static_cast<double>(rhs) || lhs == rhs;
            }

            template <
                typename T,
                typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
            Approx& epsilon(T const& newEpsilon) {
                double epsilonAsDouble = static_cast<double>(newEpsilon);
                setEpsilon(epsilonAsDouble);
                return *this;
            }

            template <
                typename T,
                typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
            Approx& margin(T const& newMargin) {
                double marginAsDouble = static_cast<double>(newMargin);
                setMargin(marginAsDouble);
                return *this;
            }

            template <
                typename T,
                typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
            Approx& scale(T const& newScale) {
                m_scale = static_cast<double>(newScale);
                return *this;
            }

            std::string toString() const;

        private:
            double m_epsilon;
            double m_margin;
            double m_scale;
            double m_value;
        };
    } // end namespace Detail

    namespace literals {
        Detail::Approx operator"" _a(long double val);
        Detail::Approx operator"" _a(unsigned long long val);
    } // end namespace literals

    template <> struct StringMaker<Catch::Detail::Approx> {
        static std::string convert(Catch::Detail::Approx const& value);
    };

} // end namespace Catch

// end catch_approx.h
// start catch_string_manip.h

#include <string>
#include <iosfwd>
#include <vector>

namespace Catch {

    bool startsWith(std::string const& s, std::string const& prefix);
    bool startsWith(std::string const& s, char prefix);
    bool endsWith(std::string const& s, std::string const& suffix);
    bool endsWith(std::string const& s, char suffix);
    bool contains(std::string const& s, std::string const& infix);
    void toLowerInPlace(std::string& s);
    std::string toLower(std::string const& s);
    //! Returns a new string without whitespace at the start/end
    std::string trim(std::string const& str);
    //! Returns a substring of the original ref without whitespace. Beware
    //! lifetimes!
    StringRef trim(StringRef ref);

    // !!! Be aware, returns refs into original string - make sure original
    // string outlives them
    std::vector<StringRef> splitStringRef(StringRef str, char delimiter);
    bool
    replaceInPlace(std::string& str, std::string const& replaceThis, std::string const& withThis);

    struct pluralise {
        pluralise(std::size_t count, std::string const& label);

        friend std::ostream& operator<<(std::ostream& os, pluralise const& pluraliser);

        std::size_t m_count;
        std::string m_label;
    };
} // namespace Catch

// end catch_string_manip.h
#ifndef CATCH_CONFIG_DISABLE_MATCHERS
// start catch_capture_matchers.h

// start catch_matchers.h

#include <string>
#include <vector>

namespace Catch {
    namespace Matchers {
        namespace Impl {

            template <typename ArgT> struct MatchAllOf;
            template <typename ArgT> struct MatchAnyOf;
            template <typename ArgT> struct MatchNotOf;

            class MatcherUntypedBase {
            public:
                MatcherUntypedBase() = default;
                MatcherUntypedBase(MatcherUntypedBase const&) = default;
                MatcherUntypedBase& operator=(MatcherUntypedBase const&) = delete;
                std::string toString() const;

            protected:
                virtual ~MatcherUntypedBase();
                virtual std::string describe() const = 0;
                mutable std::string m_cachedToString;
            };

#ifdef __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wnon-virtual-dtor"
#endif

            template <typename ObjectT> struct MatcherMethod {
                virtual bool match(ObjectT const& arg) const = 0;
            };

#if defined(__OBJC__)
            // Hack to fix Catch GH issue #1661. Could use id for generic Object
            // support. use of const for Object pointers is very uncommon and
            // under ARC it causes some kind of signature mismatch that breaks
            // compilation
            template <> struct MatcherMethod<NSString*> {
                virtual bool match(NSString* arg) const = 0;
            };
#endif

#ifdef __clang__
#pragma clang diagnostic pop
#endif

            template <typename T> struct MatcherBase : MatcherUntypedBase, MatcherMethod<T> {

                MatchAllOf<T> operator&&(MatcherBase const& other) const;
                MatchAnyOf<T> operator||(MatcherBase const& other) const;
                MatchNotOf<T> operator!() const;
            };

            template <typename ArgT> struct MatchAllOf : MatcherBase<ArgT> {
                bool match(ArgT const& arg) const override {
                    for (auto matcher : m_matchers) {
                        if (!matcher->match(arg))
                            return false;
                    }
                    return true;
                }
                std::string describe() const override {
                    std::string description;
                    description.reserve(4 + m_matchers.size() * 32);
                    description += "( ";
                    bool first = true;
                    for (auto matcher : m_matchers) {
                        if (first)
                            first = false;
                        else
                            description += " and ";
                        description += matcher->toString();
                    }
                    description += " )";
                    return description;
                }

                MatchAllOf<ArgT> operator&&(MatcherBase<ArgT> const& other) {
                    auto copy(*this);
                    copy.m_matchers.push_back(&other);
                    return copy;
                }

                std::vector<MatcherBase<ArgT> const*> m_matchers;
            };
            template <typename ArgT> struct MatchAnyOf : MatcherBase<ArgT> {

                bool match(ArgT const& arg) const override {
                    for (auto matcher : m_matchers) {
                        if (matcher->match(arg))
                            return true;
                    }
                    return false;
                }
                std::string describe() const override {
                    std::string description;
                    description.reserve(4 + m_matchers.size() * 32);
                    description += "( ";
                    bool first = true;
                    for (auto matcher : m_matchers) {
                        if (first)
                            first = false;
                        else
                            description += " or ";
                        description += matcher->toString();
                    }
                    description += " )";
                    return description;
                }

                MatchAnyOf<ArgT> operator||(MatcherBase<ArgT> const& other) {
                    auto copy(*this);
                    copy.m_matchers.push_back(&other);
                    return copy;
                }

                std::vector<MatcherBase<ArgT> const*> m_matchers;
            };

            template <typename ArgT> struct MatchNotOf : MatcherBase<ArgT> {

                MatchNotOf(MatcherBase<ArgT> const& underlyingMatcher) :
                    m_underlyingMatcher(underlyingMatcher) {}

                bool match(ArgT const& arg) const override {
                    return !m_underlyingMatcher.match(arg);
                }

                std::string describe() const override {
                    return "not " + m_underlyingMatcher.toString();
                }
                MatcherBase<ArgT> const& m_underlyingMatcher;
            };

            template <typename T>
            MatchAllOf<T> MatcherBase<T>::operator&&(MatcherBase const& other) const {
                return MatchAllOf<T>() && *this && other;
            }
            template <typename T>
            MatchAnyOf<T> MatcherBase<T>::operator||(MatcherBase const& other) const {
                return MatchAnyOf<T>() || *this || other;
            }
            template <typename T> MatchNotOf<T> MatcherBase<T>::operator!() const {
                return MatchNotOf<T>(*this);
            }

        } // namespace Impl

    } // namespace Matchers

    using namespace Matchers;
    using Matchers::Impl::MatcherBase;

} // namespace Catch

// end catch_matchers.h
// start catch_matchers_exception.hpp

namespace Catch {
    namespace Matchers {
        namespace Exception {

            class ExceptionMessageMatcher : public MatcherBase<std::exception> {
                std::string m_message;

            public:
                ExceptionMessageMatcher(std::string const& message) : m_message(message) {}

                bool match(std::exception const& ex) const override;

                std::string describe() const override;
            };

        } // namespace Exception

        Exception::ExceptionMessageMatcher Message(std::string const& message);

    } // namespace Matchers
} // namespace Catch

// end catch_matchers_exception.hpp
// start catch_matchers_floating.h

namespace Catch {
    namespace Matchers {

        namespace Floating {

            enum class FloatingPointKind : uint8_t;

            struct WithinAbsMatcher : MatcherBase<double> {
                WithinAbsMatcher(double target, double margin);
                bool match(double const& matchee) const override;
                std::string describe() const override;

            private:
                double m_target;
                double m_margin;
            };

            struct WithinUlpsMatcher : MatcherBase<double> {
                WithinUlpsMatcher(double target, uint64_t ulps, FloatingPointKind baseType);
                bool match(double const& matchee) const override;
                std::string describe() const override;

            private:
                double m_target;
                uint64_t m_ulps;
                FloatingPointKind m_type;
            };

            // Given IEEE-754 format for floats and doubles, we can assume
            // that float -> double promotion is lossless. Given this, we can
            // assume that if we do the standard relative comparison of
            // |lhs - rhs| <= epsilon * max(fabs(lhs), fabs(rhs)), then we get
            // the same result if we do this for floats, as if we do this for
            // doubles that were promoted from floats.
            struct WithinRelMatcher : MatcherBase<double> {
                WithinRelMatcher(double target, double epsilon);
                bool match(double const& matchee) const override;
                std::string describe() const override;

            private:
                double m_target;
                double m_epsilon;
            };

        } // namespace Floating

        // The following functions create the actual matcher objects.
        // This allows the types to be inferred
        Floating::WithinUlpsMatcher WithinULP(double target, uint64_t maxUlpDiff);
        Floating::WithinUlpsMatcher WithinULP(float target, uint64_t maxUlpDiff);
        Floating::WithinAbsMatcher WithinAbs(double target, double margin);
        Floating::WithinRelMatcher WithinRel(double target, double eps);
        // defaults epsilon to 100*numeric_limits<double>::epsilon()
        Floating::WithinRelMatcher WithinRel(double target);
        Floating::WithinRelMatcher WithinRel(float target, float eps);
        // defaults epsilon to 100*numeric_limits<float>::epsilon()
        Floating::WithinRelMatcher WithinRel(float target);

    } // namespace Matchers
} // namespace Catch

// end catch_matchers_floating.h
// start catch_matchers_generic.hpp

#include <functional>
#include <string>

namespace Catch {
    namespace Matchers {
        namespace Generic {

            namespace Detail {
                std::string finalizeDescription(const std::string& desc);
            }

            template <typename T> class PredicateMatcher : public MatcherBase<T> {
                std::function<bool(T const&)> m_predicate;
                std::string m_description;

            public:
                PredicateMatcher(std::function<bool(T const&)> const& elem,
                                 std::string const& descr) :
                    m_predicate(std::move(elem)),
                    m_description(Detail::finalizeDescription(descr)) {}

                bool match(T const& item) const override { return m_predicate(item); }

                std::string describe() const override { return m_description; }
            };

        } // namespace Generic

        // The following functions create the actual matcher objects.
        // The user has to explicitly specify type to the function, because
        // inferring std::function<bool(T const&)> is hard (but possible) and
        // requires a lot of TMP.
        template <typename T>
        Generic::PredicateMatcher<T> Predicate(std::function<bool(T const&)> const& predicate,
                                               std::string const& description = "") {
            return Generic::PredicateMatcher<T>(predicate, description);
        }

    } // namespace Matchers
} // namespace Catch

// end catch_matchers_generic.hpp
// start catch_matchers_string.h

#include <string>

namespace Catch {
    namespace Matchers {

        namespace StdString {

            struct CasedString {
                CasedString(std::string const& str, CaseSensitive::Choice caseSensitivity);
                std::string adjustString(std::string const& str) const;
                std::string caseSensitivitySuffix() const;

                CaseSensitive::Choice m_caseSensitivity;
                std::string m_str;
            };

            struct StringMatcherBase : MatcherBase<std::string> {
                StringMatcherBase(std::string const& operation, CasedString const& comparator);
                std::string describe() const override;

                CasedString m_comparator;
                std::string m_operation;
            };

            struct EqualsMatcher : StringMatcherBase {
                EqualsMatcher(CasedString const& comparator);
                bool match(std::string const& source) const override;
            };
            struct ContainsMatcher : StringMatcherBase {
                ContainsMatcher(CasedString const& comparator);
                bool match(std::string const& source) const override;
            };
            struct StartsWithMatcher : StringMatcherBase {
                StartsWithMatcher(CasedString const& comparator);
                bool match(std::string const& source) const override;
            };
            struct EndsWithMatcher : StringMatcherBase {
                EndsWithMatcher(CasedString const& comparator);
                bool match(std::string const& source) const override;
            };

            struct RegexMatcher : MatcherBase<std::string> {
                RegexMatcher(std::string regex, CaseSensitive::Choice caseSensitivity);
                bool match(std::string const& matchee) const override;
                std::string describe() const override;

            private:
                std::string m_regex;
                CaseSensitive::Choice m_caseSensitivity;
            };

        } // namespace StdString

        // The following functions create the actual matcher objects.
        // This allows the types to be inferred

        StdString::EqualsMatcher Equals(std::string const& str,
                                        CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes);
        StdString::ContainsMatcher
        Contains(std::string const& str,
                 CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes);
        StdString::EndsWithMatcher
        EndsWith(std::string const& str,
                 CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes);
        StdString::StartsWithMatcher
        StartsWith(std::string const& str,
                   CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes);
        StdString::RegexMatcher Matches(std::string const& regex,
                                        CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes);

    } // namespace Matchers
} // namespace Catch

// end catch_matchers_string.h
// start catch_matchers_vector.h

#include <algorithm>

namespace Catch {
    namespace Matchers {

        namespace Vector {
            template <typename T, typename Alloc>
            struct ContainsElementMatcher : MatcherBase<std::vector<T, Alloc>> {

                ContainsElementMatcher(T const& comparator) : m_comparator(comparator) {}

                bool match(std::vector<T, Alloc> const& v) const override {
                    for (auto const& el : v) {
                        if (el == m_comparator) {
                            return true;
                        }
                    }
                    return false;
                }

                std::string describe() const override {
                    return "Contains: " + ::Catch::Detail::stringify(m_comparator);
                }

                T const& m_comparator;
            };

            template <typename T, typename AllocComp, typename AllocMatch>
            struct ContainsMatcher : MatcherBase<std::vector<T, AllocMatch>> {

                ContainsMatcher(std::vector<T, AllocComp> const& comparator) :
                    m_comparator(comparator) {}

                bool match(std::vector<T, AllocMatch> const& v) const override {
                    // !TBD: see note in EqualsMatcher
                    if (m_comparator.size() > v.size())
                        return false;
                    for (auto const& comparator : m_comparator) {
                        auto present = false;
                        for (const auto& el : v) {
                            if (el == comparator) {
                                present = true;
                                break;
                            }
                        }
                        if (!present) {
                            return false;
                        }
                    }
                    return true;
                }
                std::string describe() const override {
                    return "Contains: " + ::Catch::Detail::stringify(m_comparator);
                }

                std::vector<T, AllocComp> const& m_comparator;
            };

            template <typename T, typename AllocComp, typename AllocMatch>
            struct EqualsMatcher : MatcherBase<std::vector<T, AllocMatch>> {

                EqualsMatcher(std::vector<T, AllocComp> const& comparator) :
                    m_comparator(comparator) {}

                bool match(std::vector<T, AllocMatch> const& v) const override {
                    // !TBD: This currently works if all elements can be
                    // compared using !=
                    // - a more general approach would be via a compare template
                    // that defaults to using !=. but could be specialised for,
                    // e.g. std::vector<T, Alloc> etc
                    // - then just call that directly
                    if (m_comparator.size() != v.size())
                        return false;
                    for (std::size_t i = 0; i < v.size(); ++i)
                        if (m_comparator[i] != v[i])
                            return false;
                    return true;
                }
                std::string describe() const override {
                    return "Equals: " + ::Catch::Detail::stringify(m_comparator);
                }
                std::vector<T, AllocComp> const& m_comparator;
            };

            template <typename T, typename AllocComp, typename AllocMatch>
            struct ApproxMatcher : MatcherBase<std::vector<T, AllocMatch>> {

                ApproxMatcher(std::vector<T, AllocComp> const& comparator) :
                    m_comparator(comparator) {}

                bool match(std::vector<T, AllocMatch> const& v) const override {
                    if (m_comparator.size() != v.size())
                        return false;
                    for (std::size_t i = 0; i < v.size(); ++i)
                        if (m_comparator[i] != approx(v[i]))
                            return false;
                    return true;
                }
                std::string describe() const override {
                    return "is approx: " + ::Catch::Detail::stringify(m_comparator);
                }
                template <typename = typename std::enable_if<
                              std::is_constructible<double, T>::value>::type>
                ApproxMatcher& epsilon(T const& newEpsilon) {
                    approx.epsilon(newEpsilon);
                    return *this;
                }
                template <typename = typename std::enable_if<
                              std::is_constructible<double, T>::value>::type>
                ApproxMatcher& margin(T const& newMargin) {
                    approx.margin(newMargin);
                    return *this;
                }
                template <typename = typename std::enable_if<
                              std::is_constructible<double, T>::value>::type>
                ApproxMatcher& scale(T const& newScale) {
                    approx.scale(newScale);
                    return *this;
                }

                std::vector<T, AllocComp> const& m_comparator;
                mutable Catch::Detail::Approx approx = Catch::Detail::Approx::custom();
            };

            template <typename T, typename AllocComp, typename AllocMatch>
            struct UnorderedEqualsMatcher : MatcherBase<std::vector<T, AllocMatch>> {
                UnorderedEqualsMatcher(std::vector<T, AllocComp> const& target) :
                    m_target(target) {}
                bool match(std::vector<T, AllocMatch> const& vec) const override {
                    if (m_target.size() != vec.size()) {
                        return false;
                    }
                    return std::is_permutation(m_target.begin(), m_target.end(), vec.begin());
                }

                std::string describe() const override {
                    return "UnorderedEquals: " + ::Catch::Detail::stringify(m_target);
                }

            private:
                std::vector<T, AllocComp> const& m_target;
            };

        } // namespace Vector

        // The following functions create the actual matcher objects.
        // This allows the types to be inferred

        template <typename T,
                  typename AllocComp = std::allocator<T>,
                  typename AllocMatch = AllocComp>
        Vector::ContainsMatcher<T, AllocComp, AllocMatch>
        Contains(std::vector<T, AllocComp> const& comparator) {
            return Vector::ContainsMatcher<T, AllocComp, AllocMatch>(comparator);
        }

        template <typename T, typename Alloc = std::allocator<T>>
        Vector::ContainsElementMatcher<T, Alloc> VectorContains(T const& comparator) {
            return Vector::ContainsElementMatcher<T, Alloc>(comparator);
        }

        template <typename T,
                  typename AllocComp = std::allocator<T>,
                  typename AllocMatch = AllocComp>
        Vector::EqualsMatcher<T, AllocComp, AllocMatch>
        Equals(std::vector<T, AllocComp> const& comparator) {
            return Vector::EqualsMatcher<T, AllocComp, AllocMatch>(comparator);
        }

        template <typename T,
                  typename AllocComp = std::allocator<T>,
                  typename AllocMatch = AllocComp>
        Vector::ApproxMatcher<T, AllocComp, AllocMatch>
        Approx(std::vector<T, AllocComp> const& comparator) {
            return Vector::ApproxMatcher<T, AllocComp, AllocMatch>(comparator);
        }

        template <typename T,
                  typename AllocComp = std::allocator<T>,
                  typename AllocMatch = AllocComp>
        Vector::UnorderedEqualsMatcher<T, AllocComp, AllocMatch>
        UnorderedEquals(std::vector<T, AllocComp> const& target) {
            return Vector::UnorderedEqualsMatcher<T, AllocComp, AllocMatch>(target);
        }

    } // namespace Matchers
} // namespace Catch

// end catch_matchers_vector.h
namespace Catch {

    template <typename ArgT, typename MatcherT> class MatchExpr : public ITransientExpression {
        ArgT const& m_arg;
        MatcherT m_matcher;
        StringRef m_matcherString;

    public:
        MatchExpr(ArgT const& arg, MatcherT const& matcher, StringRef const& matcherString) :
            ITransientExpression{true, matcher.match(arg)},
            m_arg(arg),
            m_matcher(matcher),
            m_matcherString(matcherString) {}

        void streamReconstructedExpression(std::ostream& os) const override {
            auto matcherAsString = m_matcher.toString();
            os << Catch::Detail::stringify(m_arg) << ' ';
            if (matcherAsString == Detail::unprintableString)
                os << m_matcherString;
            else
                os << matcherAsString;
        }
    };

    using StringMatcher = Matchers::Impl::MatcherBase<std::string>;

    void handleExceptionMatchExpr(AssertionHandler& handler,
                                  StringMatcher const& matcher,
                                  StringRef const& matcherString);

    template <typename ArgT, typename MatcherT>
    auto makeMatchExpr(ArgT const& arg, MatcherT const& matcher, StringRef const& matcherString)
        -> MatchExpr<ArgT, MatcherT> {
        return MatchExpr<ArgT, MatcherT>(arg, matcher, matcherString);
    }

} // namespace Catch

///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CHECK_THAT(macroName, matcher, resultDisposition, arg)                            \
    do {                                                                                           \
        Catch::AssertionHandler catchAssertionHandler(                                             \
            macroName##_catch_sr,                                                                  \
            CATCH_INTERNAL_LINEINFO,                                                               \
            CATCH_INTERNAL_STRINGIFY(arg) ", " CATCH_INTERNAL_STRINGIFY(matcher),                  \
            resultDisposition);                                                                    \
        INTERNAL_CATCH_TRY {                                                                       \
            catchAssertionHandler.handleExpr(                                                      \
                Catch::makeMatchExpr(arg, matcher, #matcher##_catch_sr));                          \
        }                                                                                          \
        INTERNAL_CATCH_CATCH(catchAssertionHandler)                                                \
        INTERNAL_CATCH_REACT(catchAssertionHandler)                                                \
    } while (false)

///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_THROWS_MATCHES(macroName, exceptionType, resultDisposition, matcher, ...)   \
    do {                                                                                           \
        Catch::AssertionHandler catchAssertionHandler(                                             \
            macroName##_catch_sr,                                                                  \
            CATCH_INTERNAL_LINEINFO,                                                               \
            CATCH_INTERNAL_STRINGIFY(__VA_ARGS__) ", " CATCH_INTERNAL_STRINGIFY(                   \
                exceptionType) ","                                                                 \
                               " " CATCH_INTERNAL_STRINGIFY(matcher),                              \
            resultDisposition);                                                                    \
        if (catchAssertionHandler.allowThrows())                                                   \
            try {                                                                                  \
                static_cast<void>(__VA_ARGS__);                                                    \
                catchAssertionHandler.handleUnexpectedExceptionNotThrown();                        \
            } catch (exceptionType const& ex) {                                                    \
                catchAssertionHandler.handleExpr(                                                  \
                    Catch::makeMatchExpr(ex, matcher, #matcher##_catch_sr));                       \
            } catch (...) {                                                                        \
                catchAssertionHandler.handleUnexpectedInflightException();                         \
            }                                                                                      \
        else                                                                                       \
            catchAssertionHandler.handleThrowingCallSkipped();                                     \
        INTERNAL_CATCH_REACT(catchAssertionHandler)                                                \
    } while (false)

// end catch_capture_matchers.h
#endif
// start catch_generators.hpp

// start catch_interfaces_generatortracker.h

#include <memory>

namespace Catch {

    namespace Generators {
        class GeneratorUntypedBase {
        public:
            GeneratorUntypedBase() = default;
            virtual ~GeneratorUntypedBase();
            // Attempts to move the generator to the next element
            //
            // Returns true iff the move succeeded (and a valid element
            // can be retrieved).
            virtual bool next() = 0;
        };
        using GeneratorBasePtr = std::unique_ptr<GeneratorUntypedBase>;

    } // namespace Generators

    struct IGeneratorTracker {
        virtual ~IGeneratorTracker();
        virtual auto hasGenerator() const -> bool = 0;
        virtual auto getGenerator() const -> Generators::GeneratorBasePtr const& = 0;
        virtual void setGenerator(Generators::GeneratorBasePtr&& generator) = 0;
    };

} // namespace Catch

// end catch_interfaces_generatortracker.h
// start catch_enforce.h

#include <exception>

namespace Catch {
#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
    template <typename Ex> [[noreturn]] void throw_exception(Ex const& e) { throw e; }
#else // ^^ Exceptions are enabled //  Exceptions are disabled vv
    [[noreturn]] void throw_exception(std::exception const& e);
#endif

    [[noreturn]] void throw_logic_error(std::string const& msg);
    [[noreturn]] void throw_domain_error(std::string const& msg);
    [[noreturn]] void throw_runtime_error(std::string const& msg);

} // namespace Catch

#define CATCH_MAKE_MSG(...) (Catch::ReusableStringStream() << __VA_ARGS__).str()

#define CATCH_INTERNAL_ERROR(...)                                                                  \
    Catch::throw_logic_error(                                                                      \
        CATCH_MAKE_MSG(CATCH_INTERNAL_LINEINFO << ": Internal Catch2 error: " << __VA_ARGS__))

#define CATCH_ERROR(...) Catch::throw_domain_error(CATCH_MAKE_MSG(__VA_ARGS__))

#define CATCH_RUNTIME_ERROR(...) Catch::throw_runtime_error(CATCH_MAKE_MSG(__VA_ARGS__))

#define CATCH_ENFORCE(condition, ...)                                                              \
    do {                                                                                           \
        if (!(condition))                                                                          \
            CATCH_ERROR(__VA_ARGS__);                                                              \
    } while (false)

// end catch_enforce.h
#include <memory>
#include <vector>
#include <cassert>

#include <utility>
#include <exception>

namespace Catch {

    class GeneratorException : public std::exception {
        const char* const m_msg = "";

    public:
        GeneratorException(const char* msg) : m_msg(msg) {}

        const char* what() const noexcept override final;
    };

    namespace Generators {

        // !TBD move this into its own location?
        namespace pf {
            template <typename T, typename... Args> std::unique_ptr<T> make_unique(Args&&... args) {
                return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
            }
        } // namespace pf

        template <typename T> struct IGenerator : GeneratorUntypedBase {
            virtual ~IGenerator() = default;

            // Returns the current element of the generator
            //
            // \Precondition The generator is either freshly constructed,
            // or the last call to `next()` returned true
            virtual T const& get() const = 0;
            using type = T;
        };

        template <typename T> class SingleValueGenerator final : public IGenerator<T> {
            T m_value;

        public:
            SingleValueGenerator(T&& value) : m_value(std::move(value)) {}

            T const& get() const override { return m_value; }
            bool next() override { return false; }
        };

        template <typename T> class FixedValuesGenerator final : public IGenerator<T> {
            static_assert(!std::is_same<T, bool>::value,
                          "FixedValuesGenerator does not support bools because "
                          "of std::vector<bool>"
                          "specialization, use SingleValue Generator instead.");
            std::vector<T> m_values;
            size_t m_idx = 0;

        public:
            FixedValuesGenerator(std::initializer_list<T> values) : m_values(values) {}

            T const& get() const override { return m_values[m_idx]; }
            bool next() override {
                ++m_idx;
                return m_idx < m_values.size();
            }
        };

        template <typename T> class GeneratorWrapper final {
            std::unique_ptr<IGenerator<T>> m_generator;

        public:
            GeneratorWrapper(std::unique_ptr<IGenerator<T>> generator) :
                m_generator(std::move(generator)) {}
            T const& get() const { return m_generator->get(); }
            bool next() { return m_generator->next(); }
        };

        template <typename T> GeneratorWrapper<T> value(T&& value) {
            return GeneratorWrapper<T>(
                pf::make_unique<SingleValueGenerator<T>>(std::forward<T>(value)));
        }
        template <typename T> GeneratorWrapper<T> values(std::initializer_list<T> values) {
            return GeneratorWrapper<T>(pf::make_unique<FixedValuesGenerator<T>>(values));
        }

        template <typename T> class Generators : public IGenerator<T> {
            std::vector<GeneratorWrapper<T>> m_generators;
            size_t m_current = 0;

            void populate(GeneratorWrapper<T>&& generator) {
                m_generators.emplace_back(std::move(generator));
            }
            void populate(T&& val) { m_generators.emplace_back(value(std::forward<T>(val))); }
            template <typename U> void populate(U&& val) { populate(T(std::forward<U>(val))); }
            template <typename U, typename... Gs>
            void populate(U&& valueOrGenerator, Gs&&... moreGenerators) {
                populate(std::forward<U>(valueOrGenerator));
                populate(std::forward<Gs>(moreGenerators)...);
            }

        public:
            template <typename... Gs> Generators(Gs&&... moreGenerators) {
                m_generators.reserve(sizeof...(Gs));
                populate(std::forward<Gs>(moreGenerators)...);
            }

            T const& get() const override { return m_generators[m_current].get(); }

            bool next() override {
                if (m_current >= m_generators.size()) {
                    return false;
                }
                const bool current_status = m_generators[m_current].next();
                if (!current_status) {
                    ++m_current;
                }
                return m_current < m_generators.size();
            }
        };

        template <typename... Ts>
        GeneratorWrapper<std::tuple<Ts...>>
        table(std::initializer_list<std::tuple<typename std::decay<Ts>::type...>> tuples) {
            return values<std::tuple<Ts...>>(tuples);
        }

        // Tag type to signal that a generator sequence should convert arguments
        // to a specific type
        template <typename T> struct as {};

        template <typename T, typename... Gs>
        auto makeGenerators(GeneratorWrapper<T>&& generator, Gs&&... moreGenerators)
            -> Generators<T> {
            return Generators<T>(std::move(generator), std::forward<Gs>(moreGenerators)...);
        }
        template <typename T>
        auto makeGenerators(GeneratorWrapper<T>&& generator) -> Generators<T> {
            return Generators<T>(std::move(generator));
        }
        template <typename T, typename... Gs>
        auto makeGenerators(T&& val, Gs&&... moreGenerators) -> Generators<T> {
            return makeGenerators(value(std::forward<T>(val)), std::forward<Gs>(moreGenerators)...);
        }
        template <typename T, typename U, typename... Gs>
        auto makeGenerators(as<T>, U&& val, Gs&&... moreGenerators) -> Generators<T> {
            return makeGenerators(value(T(std::forward<U>(val))),
                                  std::forward<Gs>(moreGenerators)...);
        }

        auto acquireGeneratorTracker(StringRef generatorName, SourceLineInfo const& lineInfo)
            -> IGeneratorTracker&;

        template <typename L>
        // Note: The type after -> is weird, because VS2015 cannot parse
        //       the expression used in the typedef inside, when it is in
        //       return type. Yeah.
        auto generate(StringRef generatorName,
                      SourceLineInfo const& lineInfo,
                      L const& generatorExpression)
            -> decltype(std::declval<decltype(generatorExpression())>().get()) {
            using UnderlyingType = typename decltype(generatorExpression())::type;

            IGeneratorTracker& tracker = acquireGeneratorTracker(generatorName, lineInfo);
            if (!tracker.hasGenerator()) {
                tracker.setGenerator(
                    pf::make_unique<Generators<UnderlyingType>>(generatorExpression()));
            }

            auto const& generator =
                static_cast<IGenerator<UnderlyingType> const&>(*tracker.getGenerator());
            return generator.get();
        }

    } // namespace Generators
} // namespace Catch

#define GENERATE(...)                                                                              \
    Catch::Generators::generate(INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_UNIQUE_NAME(generator)),   \
                                CATCH_INTERNAL_LINEINFO,                                           \
                                [] {                                                               \
                                    using namespace Catch::Generators;                             \
                                    return makeGenerators(__VA_ARGS__);                            \
                                }) // NOLINT(google-build-using-namespace)
#define GENERATE_COPY(...)                                                                         \
    Catch::Generators::generate(INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_UNIQUE_NAME(generator)),   \
                                CATCH_INTERNAL_LINEINFO,                                           \
                                [=] {                                                              \
                                    using namespace Catch::Generators;                             \
                                    return makeGenerators(__VA_ARGS__);                            \
                                }) // NOLINT(google-build-using-namespace)
#define GENERATE_REF(...)                                                                          \
    Catch::Generators::generate(INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_UNIQUE_NAME(generator)),   \
                                CATCH_INTERNAL_LINEINFO,                                           \
                                [&] {                                                              \
                                    using namespace Catch::Generators;                             \
                                    return makeGenerators(__VA_ARGS__);                            \
                                }) // NOLINT(google-build-using-namespace)

// end catch_generators.hpp
// start catch_generators_generic.hpp

namespace Catch {
    namespace Generators {

        template <typename T> class TakeGenerator : public IGenerator<T> {
            GeneratorWrapper<T> m_generator;
            size_t m_returned = 0;
            size_t m_target;

        public:
            TakeGenerator(size_t target, GeneratorWrapper<T>&& generator) :
                m_generator(std::move(generator)), m_target(target) {
                assert(target != 0 && "Empty generators are not allowed");
            }
            T const& get() const override { return m_generator.get(); }
            bool next() override {
                ++m_returned;
                if (m_returned >= m_target) {
                    return false;
                }

                const auto success = m_generator.next();
                // If the underlying generator does not contain enough values
                // then we cut short as well
                if (!success) {
                    m_returned = m_target;
                }
                return success;
            }
        };

        template <typename T>
        GeneratorWrapper<T> take(size_t target, GeneratorWrapper<T>&& generator) {
            return GeneratorWrapper<T>(
                pf::make_unique<TakeGenerator<T>>(target, std::move(generator)));
        }

        template <typename T, typename Predicate> class FilterGenerator : public IGenerator<T> {
            GeneratorWrapper<T> m_generator;
            Predicate m_predicate;

        public:
            template <typename P = Predicate>
            FilterGenerator(P&& pred, GeneratorWrapper<T>&& generator) :
                m_generator(std::move(generator)), m_predicate(std::forward<P>(pred)) {
                if (!m_predicate(m_generator.get())) {
                    // It might happen that there are no values that pass the
                    // filter. In that case we throw an exception.
                    auto has_initial_value = next();
                    if (!has_initial_value) {
                        Catch::throw_exception(
                            GeneratorException("No valid value found in filtered generator"));
                    }
                }
            }

            T const& get() const override { return m_generator.get(); }

            bool next() override {
                bool success = m_generator.next();
                if (!success) {
                    return false;
                }
                while (!m_predicate(m_generator.get()) && (success = m_generator.next()) == true)
                    ;
                return success;
            }
        };

        template <typename T, typename Predicate>
        GeneratorWrapper<T> filter(Predicate&& pred, GeneratorWrapper<T>&& generator) {
            return GeneratorWrapper<T>(
                std::unique_ptr<IGenerator<T>>(pf::make_unique<FilterGenerator<T, Predicate>>(
                    std::forward<Predicate>(pred), std::move(generator))));
        }

        template <typename T> class RepeatGenerator : public IGenerator<T> {
            static_assert(!std::is_same<T, bool>::value,
                          "RepeatGenerator currently does not support bools"
                          "because of std::vector<bool> specialization");
            GeneratorWrapper<T> m_generator;
            mutable std::vector<T> m_returned;
            size_t m_target_repeats;
            size_t m_current_repeat = 0;
            size_t m_repeat_index = 0;

        public:
            RepeatGenerator(size_t repeats, GeneratorWrapper<T>&& generator) :
                m_generator(std::move(generator)), m_target_repeats(repeats) {
                assert(m_target_repeats > 0 && "Repeat generator must repeat at least once");
            }

            T const& get() const override {
                if (m_current_repeat == 0) {
                    m_returned.push_back(m_generator.get());
                    return m_returned.back();
                }
                return m_returned[m_repeat_index];
            }

            bool next() override {
                // There are 2 basic cases:
                // 1) We are still reading the generator
                // 2) We are reading our own cache

                // In the first case, we need to poke the underlying generator.
                // If it happily moves, we are left in that state, otherwise it
                // is time to start reading from our cache
                if (m_current_repeat == 0) {
                    const auto success = m_generator.next();
                    if (!success) {
                        ++m_current_repeat;
                    }
                    return m_current_repeat < m_target_repeats;
                }

                // In the second case, we need to move indices forward and check
                // that we haven't run up against the end
                ++m_repeat_index;
                if (m_repeat_index == m_returned.size()) {
                    m_repeat_index = 0;
                    ++m_current_repeat;
                }
                return m_current_repeat < m_target_repeats;
            }
        };

        template <typename T>
        GeneratorWrapper<T> repeat(size_t repeats, GeneratorWrapper<T>&& generator) {
            return GeneratorWrapper<T>(
                pf::make_unique<RepeatGenerator<T>>(repeats, std::move(generator)));
        }

        template <typename T, typename U, typename Func> class MapGenerator : public IGenerator<T> {
            // TBD: provide static assert for mapping function, for friendly
            // error message
            GeneratorWrapper<U> m_generator;
            Func m_function;
            // To avoid returning dangling reference, we have to save the values
            T m_cache;

        public:
            template <typename F2 = Func>
            MapGenerator(F2&& function, GeneratorWrapper<U>&& generator) :
                m_generator(std::move(generator)),
                m_function(std::forward<F2>(function)),
                m_cache(m_function(m_generator.get())) {}

            T const& get() const override { return m_cache; }
            bool next() override {
                const auto success = m_generator.next();
                if (success) {
                    m_cache = m_function(m_generator.get());
                }
                return success;
            }
        };

        template <typename Func, typename U, typename T = FunctionReturnType<Func, U>>
        GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<U>&& generator) {
            return GeneratorWrapper<T>(pf::make_unique<MapGenerator<T, U, Func>>(
                std::forward<Func>(function), std::move(generator)));
        }

        template <typename T, typename U, typename Func>
        GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<U>&& generator) {
            return GeneratorWrapper<T>(pf::make_unique<MapGenerator<T, U, Func>>(
                std::forward<Func>(function), std::move(generator)));
        }

        template <typename T> class ChunkGenerator final : public IGenerator<std::vector<T>> {
            std::vector<T> m_chunk;
            size_t m_chunk_size;
            GeneratorWrapper<T> m_generator;
            bool m_used_up = false;

        public:
            ChunkGenerator(size_t size, GeneratorWrapper<T> generator) :
                m_chunk_size(size), m_generator(std::move(generator)) {
                m_chunk.reserve(m_chunk_size);
                if (m_chunk_size != 0) {
                    m_chunk.push_back(m_generator.get());
                    for (size_t i = 1; i < m_chunk_size; ++i) {
                        if (!m_generator.next()) {
                            Catch::throw_exception(
                                GeneratorException("Not enough values to initialize the first "
                                                   "chunk"));
                        }
                        m_chunk.push_back(m_generator.get());
                    }
                }
            }
            std::vector<T> const& get() const override { return m_chunk; }
            bool next() override {
                m_chunk.clear();
                for (size_t idx = 0; idx < m_chunk_size; ++idx) {
                    if (!m_generator.next()) {
                        return false;
                    }
                    m_chunk.push_back(m_generator.get());
                }
                return true;
            }
        };

        template <typename T>
        GeneratorWrapper<std::vector<T>> chunk(size_t size, GeneratorWrapper<T>&& generator) {
            return GeneratorWrapper<std::vector<T>>(
                pf::make_unique<ChunkGenerator<T>>(size, std::move(generator)));
        }

    } // namespace Generators
} // namespace Catch

// end catch_generators_generic.hpp
// start catch_generators_specific.hpp

// start catch_context.h

#include <memory>

namespace Catch {

    struct IResultCapture;
    struct IRunner;
    struct IConfig;
    struct IMutableContext;

    using IConfigPtr = std::shared_ptr<IConfig const>;

    struct IContext {
        virtual ~IContext();

        virtual IResultCapture* getResultCapture() = 0;
        virtual IRunner* getRunner() = 0;
        virtual IConfigPtr const& getConfig() const = 0;
    };

    struct IMutableContext : IContext {
        virtual ~IMutableContext();
        virtual void setResultCapture(IResultCapture* resultCapture) = 0;
        virtual void setRunner(IRunner* runner) = 0;
        virtual void setConfig(IConfigPtr const& config) = 0;

    private:
        static IMutableContext* currentContext;
        friend IMutableContext& getCurrentMutableContext();
        friend void cleanUpContext();
        static void createContext();
    };

    inline IMutableContext& getCurrentMutableContext() {
        if (!IMutableContext::currentContext)
            IMutableContext::createContext();
        // NOLINTNEXTLINE(clang-analyzer-core.uninitialized.UndefReturn)
        return *IMutableContext::currentContext;
    }

    inline IContext& getCurrentContext() { return getCurrentMutableContext(); }

    void cleanUpContext();

    class SimplePcg32;
    SimplePcg32& rng();
} // namespace Catch

// end catch_context.h
// start catch_interfaces_config.h

// start catch_option.hpp

namespace Catch {

    // An optional type
    template <typename T> class Option {
    public:
        Option() : nullableValue(nullptr) {}
        Option(T const& _value) : nullableValue(new (storage) T(_value)) {}
        Option(Option const& _other) : nullableValue(_other ? new (storage) T(*_other) : nullptr) {}

        ~Option() { reset(); }

        Option& operator=(Option const& _other) {
            if (&_other != this) {
                reset();
                if (_other)
                    nullableValue = new (storage) T(*_other);
            }
            return *this;
        }
        Option& operator=(T const& _value) {
            reset();
            nullableValue = new (storage) T(_value);
            return *this;
        }

        void reset() {
            if (nullableValue)
                nullableValue->~T();
            nullableValue = nullptr;
        }

        T& operator*() { return *nullableValue; }
        T const& operator*() const { return *nullableValue; }
        T* operator->() { return nullableValue; }
        const T* operator->() const { return nullableValue; }

        T valueOr(T const& defaultValue) const {
            return nullableValue ? *nullableValue : defaultValue;
        }

        bool some() const { return nullableValue != nullptr; }
        bool none() const { return nullableValue == nullptr; }

        bool operator!() const { return nullableValue == nullptr; }
        explicit operator bool() const { return some(); }

    private:
        T* nullableValue;
        alignas(alignof(T)) char storage[sizeof(T)];
    };

} // end namespace Catch

// end catch_option.hpp
#include <chrono>
#include <iosfwd>
#include <string>
#include <vector>
#include <memory>

namespace Catch {

    enum class Verbosity { Quiet = 0, Normal, High };

    struct WarnAbout {
        enum What { Nothing = 0x00, NoAssertions = 0x01, NoTests = 0x02 };
    };

    struct ShowDurations {
        enum OrNot { DefaultForReporter, Always, Never };
    };
    struct RunTests {
        enum InWhatOrder { InDeclarationOrder, InLexicographicalOrder, InRandomOrder };
    };
    struct UseColour {
        enum YesOrNo { Auto, Yes, No };
    };
    struct WaitForKeypress {
        enum When {
            Never,
            BeforeStart = 1,
            BeforeExit = 2,
            BeforeStartAndExit = BeforeStart | BeforeExit
        };
    };

    class TestSpec;

    struct IConfig : NonCopyable {

        virtual ~IConfig();

        virtual bool allowThrows() const = 0;
        virtual std::ostream& stream() const = 0;
        virtual std::string name() const = 0;
        virtual bool includeSuccessfulResults() const = 0;
        virtual bool shouldDebugBreak() const = 0;
        virtual bool warnAboutMissingAssertions() const = 0;
        virtual bool warnAboutNoTests() const = 0;
        virtual int abortAfter() const = 0;
        virtual bool showInvisibles() const = 0;
        virtual ShowDurations::OrNot showDurations() const = 0;
        virtual double minDuration() const = 0;
        virtual TestSpec const& testSpec() const = 0;
        virtual bool hasTestFilters() const = 0;
        virtual std::vector<std::string> const& getTestsOrTags() const = 0;
        virtual RunTests::InWhatOrder runOrder() const = 0;
        virtual unsigned int rngSeed() const = 0;
        virtual UseColour::YesOrNo useColour() const = 0;
        virtual std::vector<std::string> const& getSectionsToRun() const = 0;
        virtual Verbosity verbosity() const = 0;

        virtual bool benchmarkNoAnalysis() const = 0;
        virtual int benchmarkSamples() const = 0;
        virtual double benchmarkConfidenceInterval() const = 0;
        virtual unsigned int benchmarkResamples() const = 0;
        virtual std::chrono::milliseconds benchmarkWarmupTime() const = 0;
    };

    using IConfigPtr = std::shared_ptr<IConfig const>;
} // namespace Catch

// end catch_interfaces_config.h
// start catch_random_number_generator.h

#include <cstdint>

namespace Catch {

    // This is a simple implementation of C++11 Uniform Random Number
    // Generator. It does not provide all operators, because Catch2
    // does not use it, but it should behave as expected inside stdlib's
    // distributions.
    // The implementation is based on the PCG family (http://pcg-random.org)
    class SimplePcg32 {
        using state_type = std::uint64_t;

    public:
        using result_type = std::uint32_t;
        static constexpr result_type(min)() { return 0; }
        static constexpr result_type(max)() { return static_cast<result_type>(-1); }

        // Provide some default initial state for the default constructor
        SimplePcg32() : SimplePcg32(0xed743cc4U) {}

        explicit SimplePcg32(result_type seed_);

        void seed(result_type seed_);
        void discard(uint64_t skip);

        result_type operator()();

    private:
        friend bool operator==(SimplePcg32 const& lhs, SimplePcg32 const& rhs);
        friend bool operator!=(SimplePcg32 const& lhs, SimplePcg32 const& rhs);

        // In theory we also need operator<< and operator>>
        // In practice we do not use them, so we will skip them for now

        std::uint64_t m_state;
        // This part of the state determines which "stream" of the numbers
        // is chosen -- we take it as a constant for Catch2, so we only
        // need to deal with seeding the main state.
        // Picked by reading 8 bytes from `/dev/random` :-)
        static const std::uint64_t s_inc = (0x13ed0cc53f939476ULL << 1ULL) | 1ULL;
    };

} // end namespace Catch

// end catch_random_number_generator.h
#include <random>

namespace Catch {
    namespace Generators {

        template <typename Float> class RandomFloatingGenerator final : public IGenerator<Float> {
            Catch::SimplePcg32& m_rng;
            std::uniform_real_distribution<Float> m_dist;
            Float m_current_number;

        public:
            RandomFloatingGenerator(Float a, Float b) : m_rng(rng()), m_dist(a, b) {
                static_cast<void>(next());
            }

            Float const& get() const override { return m_current_number; }
            bool next() override {
                m_current_number = m_dist(m_rng);
                return true;
            }
        };

        template <typename Integer>
        class RandomIntegerGenerator final : public IGenerator<Integer> {
            Catch::SimplePcg32& m_rng;
            std::uniform_int_distribution<Integer> m_dist;
            Integer m_current_number;

        public:
            RandomIntegerGenerator(Integer a, Integer b) : m_rng(rng()), m_dist(a, b) {
                static_cast<void>(next());
            }

            Integer const& get() const override { return m_current_number; }
            bool next() override {
                m_current_number = m_dist(m_rng);
                return true;
            }
        };

        // TODO: Ideally this would be also constrained against the various char
        // types,
        //       but I don't expect users to run into that in practice.
        template <typename T>
        typename std::enable_if<std::is_integral<T>::value && !std::is_same<T, bool>::value,
                                GeneratorWrapper<T>>::type
        random(T a, T b) {
            return GeneratorWrapper<T>(pf::make_unique<RandomIntegerGenerator<T>>(a, b));
        }

        template <typename T>
        typename std::enable_if<std::is_floating_point<T>::value, GeneratorWrapper<T>>::type
        random(T a, T b) {
            return GeneratorWrapper<T>(pf::make_unique<RandomFloatingGenerator<T>>(a, b));
        }

        template <typename T> class RangeGenerator final : public IGenerator<T> {
            T m_current;
            T m_end;
            T m_step;
            bool m_positive;

        public:
            RangeGenerator(T const& start, T const& end, T const& step) :
                m_current(start), m_end(end), m_step(step), m_positive(m_step > T(0)) {
                assert(m_current != m_end && "Range start and end cannot be equal");
                assert(m_step != T(0) && "Step size cannot be zero");
                assert(
                    ((m_positive && m_current <= m_end) || (!m_positive && m_current >= m_end)) &&
                    "Step moves away from end");
            }

            RangeGenerator(T const& start, T const& end) :
                RangeGenerator(start, end, (start < end) ? T(1) : T(-1)) {}

            T const& get() const override { return m_current; }

            bool next() override {
                m_current += m_step;
                return (m_positive) ? (m_current < m_end) : (m_current > m_end);
            }
        };

        template <typename T>
        GeneratorWrapper<T> range(T const& start, T const& end, T const& step) {
            static_assert(std::is_arithmetic<T>::value && !std::is_same<T, bool>::value,
                          "Type must be numeric");
            return GeneratorWrapper<T>(pf::make_unique<RangeGenerator<T>>(start, end, step));
        }

        template <typename T> GeneratorWrapper<T> range(T const& start, T const& end) {
            static_assert(std::is_integral<T>::value && !std::is_same<T, bool>::value,
                          "Type must be an integer");
            return GeneratorWrapper<T>(pf::make_unique<RangeGenerator<T>>(start, end));
        }

        template <typename T> class IteratorGenerator final : public IGenerator<T> {
            static_assert(!std::is_same<T, bool>::value,
                          "IteratorGenerator currently does not support bools"
                          "because of std::vector<bool> specialization");

            std::vector<T> m_elems;
            size_t m_current = 0;

        public:
            template <typename InputIterator, typename InputSentinel>
            IteratorGenerator(InputIterator first, InputSentinel last) : m_elems(first, last) {
                if (m_elems.empty()) {
                    Catch::throw_exception(
                        GeneratorException("IteratorGenerator received no valid values"));
                }
            }

            T const& get() const override { return m_elems[m_current]; }

            bool next() override {
                ++m_current;
                return m_current != m_elems.size();
            }
        };

        template <typename InputIterator,
                  typename InputSentinel,
                  typename ResultType = typename std::iterator_traits<InputIterator>::value_type>
        GeneratorWrapper<ResultType> from_range(InputIterator from, InputSentinel to) {
            return GeneratorWrapper<ResultType>(
                pf::make_unique<IteratorGenerator<ResultType>>(from, to));
        }

        template <typename Container, typename ResultType = typename Container::value_type>
        GeneratorWrapper<ResultType> from_range(Container const& cnt) {
            return GeneratorWrapper<ResultType>(
                pf::make_unique<IteratorGenerator<ResultType>>(cnt.begin(), cnt.end()));
        }

    } // namespace Generators
} // namespace Catch

// end catch_generators_specific.hpp

// These files are included here so the single_include script doesn't put them
// in the conditionally compiled sections
// start catch_test_case_info.h

#include <string>
#include <vector>
#include <memory>

#ifdef __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wpadded"
#endif

namespace Catch {

    struct ITestInvoker;

    struct TestCaseInfo {
        enum SpecialProperties {
            None = 0,
            IsHidden = 1 << 1,
            ShouldFail = 1 << 2,
            MayFail = 1 << 3,
            Throws = 1 << 4,
            NonPortable = 1 << 5,
            Benchmark = 1 << 6
        };

        TestCaseInfo(std::string const& _name,
                     std::string const& _className,
                     std::string const& _description,
                     std::vector<std::string> const& _tags,
                     SourceLineInfo const& _lineInfo);

        friend void setTags(TestCaseInfo& testCaseInfo, std::vector<std::string> tags);

        bool isHidden() const;
        bool throws() const;
        bool okToFail() const;
        bool expectedToFail() const;

        std::string tagsAsString() const;

        std::string name;
        std::string className;
        std::string description;
        std::vector<std::string> tags;
        std::vector<std::string> lcaseTags;
        SourceLineInfo lineInfo;
        SpecialProperties properties;
    };

    class TestCase : public TestCaseInfo {
    public:
        TestCase(ITestInvoker* testCase, TestCaseInfo&& info);

        TestCase withName(std::string const& _newName) const;

        void invoke() const;

        TestCaseInfo const& getTestCaseInfo() const;

        bool operator==(TestCase const& other) const;
        bool operator<(TestCase const& other) const;

    private:
        std::shared_ptr<ITestInvoker> test;
    };

    TestCase makeTestCase(ITestInvoker* testCase,
                          std::string const& className,
                          NameAndTags const& nameAndTags,
                          SourceLineInfo const& lineInfo);
} // namespace Catch

#ifdef __clang__
#pragma clang diagnostic pop
#endif

// end catch_test_case_info.h
// start catch_interfaces_runner.h

namespace Catch {

    struct IRunner {
        virtual ~IRunner();
        virtual bool aborting() const = 0;
    };
} // namespace Catch

// end catch_interfaces_runner.h

#ifdef __OBJC__
// start catch_objc.hpp

#import <objc/runtime.h>

#include <string>

// NB. Any general catch headers included here must be included
// in catch.hpp first to make sure they are included by the single
// header for non obj-usage

///////////////////////////////////////////////////////////////////////////////
// This protocol is really only here for (self) documenting purposes, since
// all its methods are optional.
@protocol OcFixture

@optional

- (void)setUp;
- (void)tearDown;

@end

namespace Catch {

    class OcMethod : public ITestInvoker {

    public:
        OcMethod(Class cls, SEL sel) : m_cls(cls), m_sel(sel) {}

        virtual void invoke() const {
            id obj = [[m_cls alloc] init];

            performOptionalSelector(obj, @selector(setUp));
            performOptionalSelector(obj, m_sel);
            performOptionalSelector(obj, @selector(tearDown));

            arcSafeRelease(obj);
        }

    private:
        virtual ~OcMethod() {}

        Class m_cls;
        SEL m_sel;
    };

    namespace Detail {

        inline std::string getAnnotation(Class cls,
                                         std::string const& annotationName,
                                         std::string const& testCaseName) {
            NSString* selStr = [[NSString alloc]
                initWithFormat:@"Catch_%s_%s", annotationName.c_str(), testCaseName.c_str()];
            SEL sel = NSSelectorFromString(selStr);
            arcSafeRelease(selStr);
            id value = performOptionalSelector(cls, sel);
            if (value)
                return [(NSString*)value UTF8String];
            return "";
        }
    } // namespace Detail

    inline std::size_t registerTestMethods() {
        std::size_t noTestMethods = 0;
        int noClasses = objc_getClassList(nullptr, 0);

        Class* classes = (CATCH_UNSAFE_UNRETAINED Class*)malloc(sizeof(Class) * noClasses);
        objc_getClassList(classes, noClasses);

        for (int c = 0; c < noClasses; c++) {
            Class cls = classes[c];
            {
                u_int count;
                Method* methods = class_copyMethodList(cls, &count);
                for (u_int m = 0; m < count; m++) {
                    SEL selector = method_getName(methods[m]);
                    std::string methodName = sel_getName(selector);
                    if (startsWith(methodName, "Catch_TestCase_")) {
                        std::string testCaseName = methodName.substr(15);
                        std::string name = Detail::getAnnotation(cls, "Name", testCaseName);
                        std::string desc = Detail::getAnnotation(cls, "Description", testCaseName);
                        const char* className = class_getName(cls);

                        getMutableRegistryHub().registerTest(
                            makeTestCase(new OcMethod(cls, selector),
                                         className,
                                         NameAndTags(name.c_str(), desc.c_str()),
                                         SourceLineInfo("", 0)));
                        noTestMethods++;
                    }
                }
                free(methods);
            }
        }
        return noTestMethods;
    }

#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)

    namespace Matchers {
        namespace Impl {
            namespace NSStringMatchers {

                struct StringHolder : MatcherBase<NSString*> {
                    StringHolder(NSString* substr) : m_substr([substr copy]) {}
                    StringHolder(StringHolder const& other) : m_substr([other.m_substr copy]) {}
                    StringHolder() { arcSafeRelease(m_substr); }

                    bool match(NSString* str) const override { return false; }

                    NSString* CATCH_ARC_STRONG m_substr;
                };

                struct Equals : StringHolder {
                    Equals(NSString* substr) : StringHolder(substr) {}

                    bool match(NSString* str) const override {
                        return (str != nil || m_substr == nil) && [str isEqualToString:m_substr];
                    }

                    std::string describe() const override {
                        return "equals string: " + Catch::Detail::stringify(m_substr);
                    }
                };

                struct Contains : StringHolder {
                    Contains(NSString* substr) : StringHolder(substr) {}

                    bool match(NSString* str) const override {
                        return (str != nil || m_substr == nil) &&
                               [str rangeOfString:m_substr].location != NSNotFound;
                    }

                    std::string describe() const override {
                        return "contains string: " + Catch::Detail::stringify(m_substr);
                    }
                };

                struct StartsWith : StringHolder {
                    StartsWith(NSString* substr) : StringHolder(substr) {}

                    bool match(NSString* str) const override {
                        return (str != nil || m_substr == nil) &&
                               [str rangeOfString:m_substr].location == 0;
                    }

                    std::string describe() const override {
                        return "starts with: " + Catch::Detail::stringify(m_substr);
                    }
                };
                struct EndsWith : StringHolder {
                    EndsWith(NSString* substr) : StringHolder(substr) {}

                    bool match(NSString* str) const override {
                        return (str != nil || m_substr == nil) &&
                               [str rangeOfString:m_substr].location ==
                                   [str length] - [m_substr length];
                    }

                    std::string describe() const override {
                        return "ends with: " + Catch::Detail::stringify(m_substr);
                    }
                };

            } // namespace NSStringMatchers
        }     // namespace Impl

        inline Impl::NSStringMatchers::Equals Equals(NSString* substr) {
            return Impl::NSStringMatchers::Equals(substr);
        }

        inline Impl::NSStringMatchers::Contains Contains(NSString* substr) {
            return Impl::NSStringMatchers::Contains(substr);
        }

        inline Impl::NSStringMatchers::StartsWith StartsWith(NSString* substr) {
            return Impl::NSStringMatchers::StartsWith(substr);
        }

        inline Impl::NSStringMatchers::EndsWith EndsWith(NSString* substr) {
            return Impl::NSStringMatchers::EndsWith(substr);
        }

    } // namespace Matchers

    using namespace Matchers;

#endif // CATCH_CONFIG_DISABLE_MATCHERS

} // namespace Catch

///////////////////////////////////////////////////////////////////////////////
#define OC_MAKE_UNIQUE_NAME(root, uniqueSuffix) root##uniqueSuffix
#define OC_TEST_CASE2(name, desc, uniqueSuffix)                                                    \
    +(NSString*)OC_MAKE_UNIQUE_NAME(Catch_Name_test_, uniqueSuffix) {                              \
        return @name;                                                                              \
    }                                                                                              \
    +(NSString*)OC_MAKE_UNIQUE_NAME(Catch_Description_test_, uniqueSuffix) {                       \
        return @desc;                                                                              \
    }                                                                                              \
    -(void)OC_MAKE_UNIQUE_NAME(Catch_TestCase_test_, uniqueSuffix)

#define OC_TEST_CASE(name, desc) OC_TEST_CASE2(name, desc, __LINE__)

// end catch_objc.hpp
#endif

// Benchmarking needs the externally-facing parts of reporters to work
#if defined(CATCH_CONFIG_EXTERNAL_INTERFACES) || defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
// start catch_external_interfaces.h

// start catch_reporter_bases.hpp

// start catch_interfaces_reporter.h

// start catch_config.hpp

// start catch_test_spec_parser.h

#ifdef __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wpadded"
#endif

// start catch_test_spec.h

#ifdef __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wpadded"
#endif

// start catch_wildcard_pattern.h

namespace Catch {
    class WildcardPattern {
        enum WildcardPosition {
            NoWildcard = 0,
            WildcardAtStart = 1,
            WildcardAtEnd = 2,
            WildcardAtBothEnds = WildcardAtStart | WildcardAtEnd
        };

    public:
        WildcardPattern(std::string const& pattern, CaseSensitive::Choice caseSensitivity);
        virtual ~WildcardPattern() = default;
        virtual bool matches(std::string const& str) const;

    private:
        std::string normaliseString(std::string const& str) const;
        CaseSensitive::Choice m_caseSensitivity;
        WildcardPosition m_wildcard = NoWildcard;
        std::string m_pattern;
    };
} // namespace Catch

// end catch_wildcard_pattern.h
#include <string>
#include <vector>
#include <memory>

namespace Catch {

    struct IConfig;

    class TestSpec {
        class Pattern {
        public:
            explicit Pattern(std::string const& name);
            virtual ~Pattern();
            virtual bool matches(TestCaseInfo const& testCase) const = 0;
            std::string const& name() const;

        private:
            std::string const m_name;
        };
        using PatternPtr = std::shared_ptr<Pattern>;

        class NamePattern : public Pattern {
        public:
            explicit NamePattern(std::string const& name, std::string const& filterString);
            bool matches(TestCaseInfo const& testCase) const override;

        private:
            WildcardPattern m_wildcardPattern;
        };

        class TagPattern : public Pattern {
        public:
            explicit TagPattern(std::string const& tag, std::string const& filterString);
            bool matches(TestCaseInfo const& testCase) const override;

        private:
            std::string m_tag;
        };

        class ExcludedPattern : public Pattern {
        public:
            explicit ExcludedPattern(PatternPtr const& underlyingPattern);
            bool matches(TestCaseInfo const& testCase) const override;

        private:
            PatternPtr m_underlyingPattern;
        };

        struct Filter {
            std::vector<PatternPtr> m_patterns;

            bool matches(TestCaseInfo const& testCase) const;
            std::string name() const;
        };

    public:
        struct FilterMatch {
            std::string name;
            std::vector<TestCase const*> tests;
        };
        using Matches = std::vector<FilterMatch>;
        using vectorStrings = std::vector<std::string>;

        bool hasFilters() const;
        bool matches(TestCaseInfo const& testCase) const;
        Matches matchesByFilter(std::vector<TestCase> const& testCases,
                                IConfig const& config) const;
        const vectorStrings& getInvalidArgs() const;

    private:
        std::vector<Filter> m_filters;
        std::vector<std::string> m_invalidArgs;
        friend class TestSpecParser;
    };
} // namespace Catch

#ifdef __clang__
#pragma clang diagnostic pop
#endif

// end catch_test_spec.h
// start catch_interfaces_tag_alias_registry.h

#include <string>

namespace Catch {

    struct TagAlias;

    struct ITagAliasRegistry {
        virtual ~ITagAliasRegistry();
        // Nullptr if not present
        virtual TagAlias const* find(std::string const& alias) const = 0;
        virtual std::string expandAliases(std::string const& unexpandedTestSpec) const = 0;

        static ITagAliasRegistry const& get();
    };

} // end namespace Catch

// end catch_interfaces_tag_alias_registry.h
namespace Catch {

    class TestSpecParser {
        enum Mode { None, Name, QuotedName, Tag, EscapedName };
        Mode m_mode = None;
        Mode lastMode = None;
        bool m_exclusion = false;
        std::size_t m_pos = 0;
        std::size_t m_realPatternPos = 0;
        std::string m_arg;
        std::string m_substring;
        std::string m_patternName;
        std::vector<std::size_t> m_escapeChars;
        TestSpec::Filter m_currentFilter;
        TestSpec m_testSpec;
        ITagAliasRegistry const* m_tagAliases = nullptr;

    public:
        TestSpecParser(ITagAliasRegistry const& tagAliases);

        TestSpecParser& parse(std::string const& arg);
        TestSpec testSpec();

    private:
        bool visitChar(char c);
        void startNewMode(Mode mode);
        bool processNoneChar(char c);
        void processNameChar(char c);
        bool processOtherChar(char c);
        void endMode();
        void escape();
        bool isControlChar(char c) const;
        void saveLastMode();
        void revertBackToLastMode();
        void addFilter();
        bool separate();

        // Handles common preprocessing of the pattern for name/tag patterns
        std::string preprocessPattern();
        // Adds the current pattern as a test name
        void addNamePattern();
        // Adds the current pattern as a tag
        void addTagPattern();

        inline void addCharToPattern(char c) {
            m_substring += c;
            m_patternName += c;
            m_realPatternPos++;
        }
    };
    TestSpec parseTestSpec(std::string const& arg);

} // namespace Catch

#ifdef __clang__
#pragma clang diagnostic pop
#endif

// end catch_test_spec_parser.h
// Libstdc++ doesn't like incomplete classes for unique_ptr

#include <memory>
#include <vector>
#include <string>

#ifndef CATCH_CONFIG_CONSOLE_WIDTH
#define CATCH_CONFIG_CONSOLE_WIDTH 80
#endif

namespace Catch {

    struct IStream;

    struct ConfigData {
        bool listTests = false;
        bool listTags = false;
        bool listReporters = false;
        bool listTestNamesOnly = false;

        bool showSuccessfulTests = false;
        bool shouldDebugBreak = false;
        bool noThrow = false;
        bool showHelp = false;
        bool showInvisibles = false;
        bool filenamesAsTags = false;
        bool libIdentify = false;

        int abortAfter = -1;
        unsigned int rngSeed = 0;

        bool benchmarkNoAnalysis = false;
        unsigned int benchmarkSamples = 100;
        double benchmarkConfidenceInterval = 0.95;
        unsigned int benchmarkResamples = 100000;
        std::chrono::milliseconds::rep benchmarkWarmupTime = 100;

        Verbosity verbosity = Verbosity::Normal;
        WarnAbout::What warnings = WarnAbout::Nothing;
        ShowDurations::OrNot showDurations = ShowDurations::DefaultForReporter;
        double minDuration = -1;
        RunTests::InWhatOrder runOrder = RunTests::InDeclarationOrder;
        UseColour::YesOrNo useColour = UseColour::Auto;
        WaitForKeypress::When waitForKeypress = WaitForKeypress::Never;

        std::string outputFilename;
        std::string name;
        std::string processName;
#ifndef CATCH_CONFIG_DEFAULT_REPORTER
#define CATCH_CONFIG_DEFAULT_REPORTER "console"
#endif
        std::string reporterName = CATCH_CONFIG_DEFAULT_REPORTER;
#undef CATCH_CONFIG_DEFAULT_REPORTER

        std::vector<std::string> testsOrTags;
        std::vector<std::string> sectionsToRun;
    };

    class Config : public IConfig {
    public:
        Config() = default;
        Config(ConfigData const& data);
        virtual ~Config() = default;

        std::string const& getFilename() const;

        bool listTests() const;
        bool listTestNamesOnly() const;
        bool listTags() const;
        bool listReporters() const;

        std::string getProcessName() const;
        std::string const& getReporterName() const;

        std::vector<std::string> const& getTestsOrTags() const override;
        std::vector<std::string> const& getSectionsToRun() const override;

        TestSpec const& testSpec() const override;
        bool hasTestFilters() const override;

        bool showHelp() const;

        // IConfig interface
        bool allowThrows() const override;
        std::ostream& stream() const override;
        std::string name() const override;
        bool includeSuccessfulResults() const override;
        bool warnAboutMissingAssertions() const override;
        bool warnAboutNoTests() const override;
        ShowDurations::OrNot showDurations() const override;
        double minDuration() const override;
        RunTests::InWhatOrder runOrder() const override;
        unsigned int rngSeed() const override;
        UseColour::YesOrNo useColour() const override;
        bool shouldDebugBreak() const override;
        int abortAfter() const override;
        bool showInvisibles() const override;
        Verbosity verbosity() const override;
        bool benchmarkNoAnalysis() const override;
        int benchmarkSamples() const override;
        double benchmarkConfidenceInterval() const override;
        unsigned int benchmarkResamples() const override;
        std::chrono::milliseconds benchmarkWarmupTime() const override;

    private:
        IStream const* openStream();
        ConfigData m_data;

        std::unique_ptr<IStream const> m_stream;
        TestSpec m_testSpec;
        bool m_hasTestFilters = false;
    };

} // end namespace Catch

// end catch_config.hpp
// start catch_assertionresult.h

#include <string>

namespace Catch {

    struct AssertionResultData {
        AssertionResultData() = delete;

        AssertionResultData(ResultWas::OfType _resultType, LazyExpression const& _lazyExpression);

        std::string message;
        mutable std::string reconstructedExpression;
        LazyExpression lazyExpression;
        ResultWas::OfType resultType;

        std::string reconstructExpression() const;
    };

    class AssertionResult {
    public:
        AssertionResult() = delete;
        AssertionResult(AssertionInfo const& info, AssertionResultData const& data);

        bool isOk() const;
        bool succeeded() const;
        ResultWas::OfType getResultType() const;
        bool hasExpression() const;
        bool hasMessage() const;
        std::string getExpression() const;
        std::string getExpressionInMacro() const;
        bool hasExpandedExpression() const;
        std::string getExpandedExpression() const;
        std::string getMessage() const;
        SourceLineInfo getSourceInfo() const;
        StringRef getTestMacroName() const;

        // protected:
        AssertionInfo m_info;
        AssertionResultData m_resultData;
    };

} // end namespace Catch

// end catch_assertionresult.h
#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
// start catch_estimate.hpp

// Statistics estimates

namespace Catch {
    namespace Benchmark {
        template <typename Duration> struct Estimate {
            Duration point;
            Duration lower_bound;
            Duration upper_bound;
            double confidence_interval;

            template <typename Duration2> operator Estimate<Duration2>() const {
                return {point, lower_bound, upper_bound, confidence_interval};
            }
        };
    } // namespace Benchmark
} // namespace Catch

// end catch_estimate.hpp
// start catch_outlier_classification.hpp

// Outlier information

namespace Catch {
    namespace Benchmark {
        struct OutlierClassification {
            int samples_seen = 0;
            int low_severe = 0;  // more than 3 times IQR below Q1
            int low_mild = 0;    // 1.5 to 3 times IQR below Q1
            int high_mild = 0;   // 1.5 to 3 times IQR above Q3
            int high_severe = 0; // more than 3 times IQR above Q3

            int total() const { return low_severe + low_mild + high_mild + high_severe; }
        };
    } // namespace Benchmark
} // namespace Catch

// end catch_outlier_classification.hpp

#include <iterator>
#endif // CATCH_CONFIG_ENABLE_BENCHMARKING

#include <string>
#include <iosfwd>
#include <map>
#include <set>
#include <memory>
#include <algorithm>

namespace Catch {

    struct ReporterConfig {
        explicit ReporterConfig(IConfigPtr const& _fullConfig);

        ReporterConfig(IConfigPtr const& _fullConfig, std::ostream& _stream);

        std::ostream& stream() const;
        IConfigPtr fullConfig() const;

    private:
        std::ostream* m_stream;
        IConfigPtr m_fullConfig;
    };

    struct ReporterPreferences {
        bool shouldRedirectStdOut = false;
        bool shouldReportAllAssertions = false;
    };

    template <typename T> struct LazyStat : Option<T> {
        LazyStat& operator=(T const& _value) {
            Option<T>::operator=(_value);
            used = false;
            return *this;
        }
        void reset() {
            Option<T>::reset();
            used = false;
        }
        bool used = false;
    };

    struct TestRunInfo {
        TestRunInfo(std::string const& _name);
        std::string name;
    };
    struct GroupInfo {
        GroupInfo(std::string const& _name, std::size_t _groupIndex, std::size_t _groupsCount);

        std::string name;
        std::size_t groupIndex;
        std::size_t groupsCounts;
    };

    struct AssertionStats {
        AssertionStats(AssertionResult const& _assertionResult,
                       std::vector<MessageInfo> const& _infoMessages,
                       Totals const& _totals);

        AssertionStats(AssertionStats const&) = default;
        AssertionStats(AssertionStats&&) = default;
        AssertionStats& operator=(AssertionStats const&) = delete;
        AssertionStats& operator=(AssertionStats&&) = delete;
        virtual ~AssertionStats();

        AssertionResult assertionResult;
        std::vector<MessageInfo> infoMessages;
        Totals totals;
    };

    struct SectionStats {
        SectionStats(SectionInfo const& _sectionInfo,
                     Counts const& _assertions,
                     double _durationInSeconds,
                     bool _missingAssertions);
        SectionStats(SectionStats const&) = default;
        SectionStats(SectionStats&&) = default;
        SectionStats& operator=(SectionStats const&) = default;
        SectionStats& operator=(SectionStats&&) = default;
        virtual ~SectionStats();

        SectionInfo sectionInfo;
        Counts assertions;
        double durationInSeconds;
        bool missingAssertions;
    };

    struct TestCaseStats {
        TestCaseStats(TestCaseInfo const& _testInfo,
                      Totals const& _totals,
                      std::string const& _stdOut,
                      std::string const& _stdErr,
                      bool _aborting);

        TestCaseStats(TestCaseStats const&) = default;
        TestCaseStats(TestCaseStats&&) = default;
        TestCaseStats& operator=(TestCaseStats const&) = default;
        TestCaseStats& operator=(TestCaseStats&&) = default;
        virtual ~TestCaseStats();

        TestCaseInfo testInfo;
        Totals totals;
        std::string stdOut;
        std::string stdErr;
        bool aborting;
    };

    struct TestGroupStats {
        TestGroupStats(GroupInfo const& _groupInfo, Totals const& _totals, bool _aborting);
        TestGroupStats(GroupInfo const& _groupInfo);

        TestGroupStats(TestGroupStats const&) = default;
        TestGroupStats(TestGroupStats&&) = default;
        TestGroupStats& operator=(TestGroupStats const&) = default;
        TestGroupStats& operator=(TestGroupStats&&) = default;
        virtual ~TestGroupStats();

        GroupInfo groupInfo;
        Totals totals;
        bool aborting;
    };

    struct TestRunStats {
        TestRunStats(TestRunInfo const& _runInfo, Totals const& _totals, bool _aborting);

        TestRunStats(TestRunStats const&) = default;
        TestRunStats(TestRunStats&&) = default;
        TestRunStats& operator=(TestRunStats const&) = default;
        TestRunStats& operator=(TestRunStats&&) = default;
        virtual ~TestRunStats();

        TestRunInfo runInfo;
        Totals totals;
        bool aborting;
    };

#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
    struct BenchmarkInfo {
        std::string name;
        double estimatedDuration;
        int iterations;
        int samples;
        unsigned int resamples;
        double clockResolution;
        double clockCost;
    };

    template <class Duration> struct BenchmarkStats {
        BenchmarkInfo info;

        std::vector<Duration> samples;
        Benchmark::Estimate<Duration> mean;
        Benchmark::Estimate<Duration> standardDeviation;
        Benchmark::OutlierClassification outliers;
        double outlierVariance;

        template <typename Duration2> operator BenchmarkStats<Duration2>() const {
            std::vector<Duration2> samples2;
            samples2.reserve(samples.size());
            std::transform(samples.begin(),
                           samples.end(),
                           std::back_inserter(samples2),
                           [](Duration d) { return Duration2(d); });
            return {
                info,
                std::move(samples2),
                mean,
                standardDeviation,
                outliers,
                outlierVariance,
            };
        }
    };
#endif // CATCH_CONFIG_ENABLE_BENCHMARKING

    struct IStreamingReporter {
        virtual ~IStreamingReporter() = default;

        // Implementing class must also provide the following static methods:
        // static std::string getDescription();
        // static std::set<Verbosity> getSupportedVerbosities()

        virtual ReporterPreferences getPreferences() const = 0;

        virtual void noMatchingTestCases(std::string const& spec) = 0;

        virtual void reportInvalidArguments(std::string const&) {}

        virtual void testRunStarting(TestRunInfo const& testRunInfo) = 0;
        virtual void testGroupStarting(GroupInfo const& groupInfo) = 0;

        virtual void testCaseStarting(TestCaseInfo const& testInfo) = 0;
        virtual void sectionStarting(SectionInfo const& sectionInfo) = 0;

#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
        virtual void benchmarkPreparing(std::string const&) {}
        virtual void benchmarkStarting(BenchmarkInfo const&) {}
        virtual void benchmarkEnded(BenchmarkStats<> const&) {}
        virtual void benchmarkFailed(std::string const&) {}
#endif // CATCH_CONFIG_ENABLE_BENCHMARKING

        virtual void assertionStarting(AssertionInfo const& assertionInfo) = 0;

        // The return value indicates if the messages buffer should be cleared:
        virtual bool assertionEnded(AssertionStats const& assertionStats) = 0;

        virtual void sectionEnded(SectionStats const& sectionStats) = 0;
        virtual void testCaseEnded(TestCaseStats const& testCaseStats) = 0;
        virtual void testGroupEnded(TestGroupStats const& testGroupStats) = 0;
        virtual void testRunEnded(TestRunStats const& testRunStats) = 0;

        virtual void skipTest(TestCaseInfo const& testInfo) = 0;

        // Default empty implementation provided
        virtual void fatalErrorEncountered(StringRef name);

        virtual bool isMulti() const;
    };
    using IStreamingReporterPtr = std::unique_ptr<IStreamingReporter>;

    struct IReporterFactory {
        virtual ~IReporterFactory();
        virtual IStreamingReporterPtr create(ReporterConfig const& config) const = 0;
        virtual std::string getDescription() const = 0;
    };
    using IReporterFactoryPtr = std::shared_ptr<IReporterFactory>;

    struct IReporterRegistry {
        using FactoryMap = std::map<std::string, IReporterFactoryPtr>;
        using Listeners = std::vector<IReporterFactoryPtr>;

        virtual ~IReporterRegistry();
        virtual IStreamingReporterPtr create(std::string const& name,
                                             IConfigPtr const& config) const = 0;
        virtual FactoryMap const& getFactories() const = 0;
        virtual Listeners const& getListeners() const = 0;
    };

} // end namespace Catch

// end catch_interfaces_reporter.h
#include <algorithm>
#include <cstring>
#include <cfloat>
#include <cstdio>
#include <cassert>
#include <memory>
#include <ostream>

namespace Catch {
    void prepareExpandedExpression(AssertionResult& result);

    // Returns double formatted as %.3f (format expected on output)
    std::string getFormattedDuration(double duration);

    //! Should the reporter show
    bool shouldShowDuration(IConfig const& config, double duration);

    std::string serializeFilters(std::vector<std::string> const& container);

    template <typename DerivedT> struct StreamingReporterBase : IStreamingReporter {

        StreamingReporterBase(ReporterConfig const& _config) :
            m_config(_config.fullConfig()), stream(_config.stream()) {
            m_reporterPrefs.shouldRedirectStdOut = false;
            if (!DerivedT::getSupportedVerbosities().count(m_config->verbosity()))
                CATCH_ERROR("Verbosity level not supported by this reporter");
        }

        ReporterPreferences getPreferences() const override { return m_reporterPrefs; }

        static std::set<Verbosity> getSupportedVerbosities() { return {Verbosity::Normal}; }

        ~StreamingReporterBase() override = default;

        void noMatchingTestCases(std::string const&) override {}

        void reportInvalidArguments(std::string const&) override {}

        void testRunStarting(TestRunInfo const& _testRunInfo) override {
            currentTestRunInfo = _testRunInfo;
        }

        void testGroupStarting(GroupInfo const& _groupInfo) override {
            currentGroupInfo = _groupInfo;
        }

        void testCaseStarting(TestCaseInfo const& _testInfo) override {
            currentTestCaseInfo = _testInfo;
        }
        void sectionStarting(SectionInfo const& _sectionInfo) override {
            m_sectionStack.push_back(_sectionInfo);
        }

        void sectionEnded(SectionStats const& /* _sectionStats */) override {
            m_sectionStack.pop_back();
        }
        void testCaseEnded(TestCaseStats const& /* _testCaseStats */) override {
            currentTestCaseInfo.reset();
        }
        void testGroupEnded(TestGroupStats const& /* _testGroupStats */) override {
            currentGroupInfo.reset();
        }
        void testRunEnded(TestRunStats const& /* _testRunStats */) override {
            currentTestCaseInfo.reset();
            currentGroupInfo.reset();
            currentTestRunInfo.reset();
        }

        void skipTest(TestCaseInfo const&) override {
            // Don't do anything with this by default.
            // It can optionally be overridden in the derived class.
        }

        IConfigPtr m_config;
        std::ostream& stream;

        LazyStat<TestRunInfo> currentTestRunInfo;
        LazyStat<GroupInfo> currentGroupInfo;
        LazyStat<TestCaseInfo> currentTestCaseInfo;

        std::vector<SectionInfo> m_sectionStack;
        ReporterPreferences m_reporterPrefs;
    };

    template <typename DerivedT> struct CumulativeReporterBase : IStreamingReporter {
        template <typename T, typename ChildNodeT> struct Node {
            explicit Node(T const& _value) : value(_value) {}
            virtual ~Node() {}

            using ChildNodes = std::vector<std::shared_ptr<ChildNodeT>>;
            T value;
            ChildNodes children;
        };
        struct SectionNode {
            explicit SectionNode(SectionStats const& _stats) : stats(_stats) {}
            virtual ~SectionNode() = default;

            bool operator==(SectionNode const& other) const {
                return stats.sectionInfo.lineInfo == other.stats.sectionInfo.lineInfo;
            }
            bool operator==(std::shared_ptr<SectionNode> const& other) const {
                return operator==(*other);
            }

            SectionStats stats;
            using ChildSections = std::vector<std::shared_ptr<SectionNode>>;
            using Assertions = std::vector<AssertionStats>;
            ChildSections childSections;
            Assertions assertions;
            std::string stdOut;
            std::string stdErr;
        };

        struct BySectionInfo {
            BySectionInfo(SectionInfo const& other) : m_other(other) {}
            BySectionInfo(BySectionInfo const& other) : m_other(other.m_other) {}
            bool operator()(std::shared_ptr<SectionNode> const& node) const {
                return ((node->stats.sectionInfo.name == m_other.name) &&
                        (node->stats.sectionInfo.lineInfo == m_other.lineInfo));
            }
            void operator=(BySectionInfo const&) = delete;

        private:
            SectionInfo const& m_other;
        };

        using TestCaseNode = Node<TestCaseStats, SectionNode>;
        using TestGroupNode = Node<TestGroupStats, TestCaseNode>;
        using TestRunNode = Node<TestRunStats, TestGroupNode>;

        CumulativeReporterBase(ReporterConfig const& _config) :
            m_config(_config.fullConfig()), stream(_config.stream()) {
            m_reporterPrefs.shouldRedirectStdOut = false;
            if (!DerivedT::getSupportedVerbosities().count(m_config->verbosity()))
                CATCH_ERROR("Verbosity level not supported by this reporter");
        }
        ~CumulativeReporterBase() override = default;

        ReporterPreferences getPreferences() const override { return m_reporterPrefs; }

        static std::set<Verbosity> getSupportedVerbosities() { return {Verbosity::Normal}; }

        void testRunStarting(TestRunInfo const&) override {}
        void testGroupStarting(GroupInfo const&) override {}

        void testCaseStarting(TestCaseInfo const&) override {}

        void sectionStarting(SectionInfo const& sectionInfo) override {
            SectionStats incompleteStats(sectionInfo, Counts(), 0, false);
            std::shared_ptr<SectionNode> node;
            if (m_sectionStack.empty()) {
                if (!m_rootSection)
                    m_rootSection = std::make_shared<SectionNode>(incompleteStats);
                node = m_rootSection;
            } else {
                SectionNode& parentNode = *m_sectionStack.back();
                auto it = std::find_if(parentNode.childSections.begin(),
                                       parentNode.childSections.end(),
                                       BySectionInfo(sectionInfo));
                if (it == parentNode.childSections.end()) {
                    node = std::make_shared<SectionNode>(incompleteStats);
                    parentNode.childSections.push_back(node);
                } else
                    node = *it;
            }
            m_sectionStack.push_back(node);
            m_deepestSection = std::move(node);
        }

        void assertionStarting(AssertionInfo const&) override {}

        bool assertionEnded(AssertionStats const& assertionStats) override {
            assert(!m_sectionStack.empty());
            // AssertionResult holds a pointer to a temporary
            // DecomposedExpression, which getExpandedExpression() calls to
            // build the expression string. Our section stack copy of the
            // assertionResult will likely outlive the temporary, so it must be
            // expanded or discarded now to avoid calling a destroyed object
            // later.
            prepareExpandedExpression(const_cast<AssertionResult&>(assertionStats.assertionResult));
            SectionNode& sectionNode = *m_sectionStack.back();
            sectionNode.assertions.push_back(assertionStats);
            return true;
        }
        void sectionEnded(SectionStats const& sectionStats) override {
            assert(!m_sectionStack.empty());
            SectionNode& node = *m_sectionStack.back();
            node.stats = sectionStats;
            m_sectionStack.pop_back();
        }
        void testCaseEnded(TestCaseStats const& testCaseStats) override {
            auto node = std::make_shared<TestCaseNode>(testCaseStats);
            assert(m_sectionStack.size() == 0);
            node->children.push_back(m_rootSection);
            m_testCases.push_back(node);
            m_rootSection.reset();

            assert(m_deepestSection);
            m_deepestSection->stdOut = testCaseStats.stdOut;
            m_deepestSection->stdErr = testCaseStats.stdErr;
        }
        void testGroupEnded(TestGroupStats const& testGroupStats) override {
            auto node = std::make_shared<TestGroupNode>(testGroupStats);
            node->children.swap(m_testCases);
            m_testGroups.push_back(node);
        }
        void testRunEnded(TestRunStats const& testRunStats) override {
            auto node = std::make_shared<TestRunNode>(testRunStats);
            node->children.swap(m_testGroups);
            m_testRuns.push_back(node);
            testRunEndedCumulative();
        }
        virtual void testRunEndedCumulative() = 0;

        void skipTest(TestCaseInfo const&) override {}

        IConfigPtr m_config;
        std::ostream& stream;
        std::vector<AssertionStats> m_assertions;
        std::vector<std::vector<std::shared_ptr<SectionNode>>> m_sections;
        std::vector<std::shared_ptr<TestCaseNode>> m_testCases;
        std::vector<std::shared_ptr<TestGroupNode>> m_testGroups;

        std::vector<std::shared_ptr<TestRunNode>> m_testRuns;

        std::shared_ptr<SectionNode> m_rootSection;
        std::shared_ptr<SectionNode> m_deepestSection;
        std::vector<std::shared_ptr<SectionNode>> m_sectionStack;
        ReporterPreferences m_reporterPrefs;
    };

    template <char C> char const* getLineOfChars() {
        static char line[CATCH_CONFIG_CONSOLE_WIDTH] = {0};
        if (!*line) {
            std::memset(line, C, CATCH_CONFIG_CONSOLE_WIDTH - 1);
            line[CATCH_CONFIG_CONSOLE_WIDTH - 1] = 0;
        }
        return line;
    }

    struct TestEventListenerBase : StreamingReporterBase<TestEventListenerBase> {
        TestEventListenerBase(ReporterConfig const& _config);

        static std::set<Verbosity> getSupportedVerbosities();

        void assertionStarting(AssertionInfo const&) override;
        bool assertionEnded(AssertionStats const&) override;
    };

} // end namespace Catch

// end catch_reporter_bases.hpp
// start catch_console_colour.h

namespace Catch {

    struct Colour {
        enum Code {
            None = 0,

            White,
            Red,
            Green,
            Blue,
            Cyan,
            Yellow,
            Grey,

            Bright = 0x10,

            BrightRed = Bright | Red,
            BrightGreen = Bright | Green,
            LightGrey = Bright | Grey,
            BrightWhite = Bright | White,
            BrightYellow = Bright | Yellow,

            // By intention
            FileName = LightGrey,
            Warning = BrightYellow,
            ResultError = BrightRed,
            ResultSuccess = BrightGreen,
            ResultExpectedFailure = Warning,

            Error = BrightRed,
            Success = Green,

            OriginalExpression = Cyan,
            ReconstructedExpression = BrightYellow,

            SecondaryText = LightGrey,
            Headers = White
        };

        // Use constructed object for RAII guard
        Colour(Code _colourCode);
        Colour(Colour&& other) noexcept;
        Colour& operator=(Colour&& other) noexcept;
        ~Colour();

        // Use static method for one-shot changes
        static void use(Code _colourCode);

    private:
        bool m_moved = false;
    };

    std::ostream& operator<<(std::ostream& os, Colour const&);

} // end namespace Catch

// end catch_console_colour.h
// start catch_reporter_registrars.hpp

namespace Catch {

    template <typename T> class ReporterRegistrar {

        class ReporterFactory : public IReporterFactory {

            IStreamingReporterPtr create(ReporterConfig const& config) const override {
                return std::unique_ptr<T>(new T(config));
            }

            std::string getDescription() const override { return T::getDescription(); }
        };

    public:
        explicit ReporterRegistrar(std::string const& name) {
            getMutableRegistryHub().registerReporter(name, std::make_shared<ReporterFactory>());
        }
    };

    template <typename T> class ListenerRegistrar {

        class ListenerFactory : public IReporterFactory {

            IStreamingReporterPtr create(ReporterConfig const& config) const override {
                return std::unique_ptr<T>(new T(config));
            }
            std::string getDescription() const override { return std::string(); }
        };

    public:
        ListenerRegistrar() {
            getMutableRegistryHub().registerListener(std::make_shared<ListenerFactory>());
        }
    };
} // namespace Catch

#if !defined(CATCH_CONFIG_DISABLE)

#define CATCH_REGISTER_REPORTER(name, reporterType)                                                \
    CATCH_INTERNAL_START_WARNINGS_SUPPRESSION                                                      \
    CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS                                                       \
    namespace {                                                                                    \
        Catch::ReporterRegistrar<reporterType> catch_internal_RegistrarFor##reporterType(name);    \
    }                                                                                              \
    CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION

#define CATCH_REGISTER_LISTENER(listenerType)                                                      \
    CATCH_INTERNAL_START_WARNINGS_SUPPRESSION                                                      \
    CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS                                                       \
    namespace {                                                                                    \
        Catch::ListenerRegistrar<listenerType> catch_internal_RegistrarFor##listenerType;          \
    }                                                                                              \
    CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION
#else // CATCH_CONFIG_DISABLE

#define CATCH_REGISTER_REPORTER(name, reporterType)
#define CATCH_REGISTER_LISTENER(listenerType)

#endif // CATCH_CONFIG_DISABLE

// end catch_reporter_registrars.hpp
// Allow users to base their work off existing reporters
// start catch_reporter_compact.h

namespace Catch {

    struct CompactReporter : StreamingReporterBase<CompactReporter> {

        using StreamingReporterBase::StreamingReporterBase;

        ~CompactReporter() override;

        static std::string getDescription();

        void noMatchingTestCases(std::string const& spec) override;

        void assertionStarting(AssertionInfo const&) override;

        bool assertionEnded(AssertionStats const& _assertionStats) override;

        void sectionEnded(SectionStats const& _sectionStats) override;

        void testRunEnded(TestRunStats const& _testRunStats) override;
    };

} // end namespace Catch

// end catch_reporter_compact.h
// start catch_reporter_console.h

#if defined(_MSC_VER)
#pragma warning(push)
#pragma warning(disable : 4061) // Not all labels are EXPLICITLY handled in
                                // switch Note that 4062 (not all labels are
                                // handled and default is missing) is enabled
#endif

namespace Catch {
    // Fwd decls
    struct SummaryColumn;
    class TablePrinter;

    struct ConsoleReporter : StreamingReporterBase<ConsoleReporter> {
        std::unique_ptr<TablePrinter> m_tablePrinter;

        ConsoleReporter(ReporterConfig const& config);
        ~ConsoleReporter() override;
        static std::string getDescription();

        void noMatchingTestCases(std::string const& spec) override;

        void reportInvalidArguments(std::string const& arg) override;

        void assertionStarting(AssertionInfo const&) override;

        bool assertionEnded(AssertionStats const& _assertionStats) override;

        void sectionStarting(SectionInfo const& _sectionInfo) override;
        void sectionEnded(SectionStats const& _sectionStats) override;

#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
        void benchmarkPreparing(std::string const& name) override;
        void benchmarkStarting(BenchmarkInfo const& info) override;
        void benchmarkEnded(BenchmarkStats<> const& stats) override;
        void benchmarkFailed(std::string const& error) override;
#endif // CATCH_CONFIG_ENABLE_BENCHMARKING

        void testCaseEnded(TestCaseStats const& _testCaseStats) override;
        void testGroupEnded(TestGroupStats const& _testGroupStats) override;
        void testRunEnded(TestRunStats const& _testRunStats) override;
        void testRunStarting(TestRunInfo const& _testRunInfo) override;

    private:
        void lazyPrint();

        void lazyPrintWithoutClosingBenchmarkTable();
        void lazyPrintRunInfo();
        void lazyPrintGroupInfo();
        void printTestCaseAndSectionHeader();

        void printClosedHeader(std::string const& _name);
        void printOpenHeader(std::string const& _name);

        // if string has a : in first line will set indent to follow it on
        // subsequent lines
        void printHeaderString(std::string const& _string, std::size_t indent = 0);

        void printTotals(Totals const& totals);
        void printSummaryRow(std::string const& label,
                             std::vector<SummaryColumn> const& cols,
                             std::size_t row);

        void printTotalsDivider(Totals const& totals);
        void printSummaryDivider();
        void printTestFilters();

    private:
        bool m_headerPrinted = false;
    };

} // end namespace Catch

#if defined(_MSC_VER)
#pragma warning(pop)
#endif

// end catch_reporter_console.h
// start catch_reporter_junit.h

// start catch_xmlwriter.h

#include <vector>

namespace Catch {
    enum class XmlFormatting {
        None = 0x00,
        Indent = 0x01,
        Newline = 0x02,
    };

    XmlFormatting operator|(XmlFormatting lhs, XmlFormatting rhs);
    XmlFormatting operator&(XmlFormatting lhs, XmlFormatting rhs);

    class XmlEncode {
    public:
        enum ForWhat { ForTextNodes, ForAttributes };

        XmlEncode(std::string const& str, ForWhat forWhat = ForTextNodes);

        void encodeTo(std::ostream& os) const;

        friend std::ostream& operator<<(std::ostream& os, XmlEncode const& xmlEncode);

    private:
        std::string m_str;
        ForWhat m_forWhat;
    };

    class XmlWriter {
    public:
        class ScopedElement {
        public:
            ScopedElement(XmlWriter* writer, XmlFormatting fmt);

            ScopedElement(ScopedElement&& other) noexcept;
            ScopedElement& operator=(ScopedElement&& other) noexcept;

            ~ScopedElement();

            ScopedElement& writeText(std::string const& text,
                                     XmlFormatting fmt = XmlFormatting::Newline |
                                                         XmlFormatting::Indent);

            template <typename T>
            ScopedElement& writeAttribute(std::string const& name, T const& attribute) {
                m_writer->writeAttribute(name, attribute);
                return *this;
            }

        private:
            mutable XmlWriter* m_writer = nullptr;
            XmlFormatting m_fmt;
        };

        XmlWriter(std::ostream& os = Catch::cout());
        ~XmlWriter();

        XmlWriter(XmlWriter const&) = delete;
        XmlWriter& operator=(XmlWriter const&) = delete;

        XmlWriter& startElement(std::string const& name,
                                XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent);

        ScopedElement scopedElement(std::string const& name,
                                    XmlFormatting fmt = XmlFormatting::Newline |
                                                        XmlFormatting::Indent);

        XmlWriter& endElement(XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent);

        XmlWriter& writeAttribute(std::string const& name, std::string const& attribute);

        XmlWriter& writeAttribute(std::string const& name, bool attribute);

        template <typename T>
        XmlWriter& writeAttribute(std::string const& name, T const& attribute) {
            ReusableStringStream rss;
            rss << attribute;
            return writeAttribute(name, rss.str());
        }

        XmlWriter& writeText(std::string const& text,
                             XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent);

        XmlWriter& writeComment(std::string const& text,
                                XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent);

        void writeStylesheetRef(std::string const& url);

        XmlWriter& writeBlankLine();

        void ensureTagClosed();

    private:
        void applyFormatting(XmlFormatting fmt);

        void writeDeclaration();

        void newlineIfNecessary();

        bool m_tagIsOpen = false;
        bool m_needsNewline = false;
        std::vector<std::string> m_tags;
        std::string m_indent;
        std::ostream& m_os;
    };

} // namespace Catch

// end catch_xmlwriter.h
namespace Catch {

    class JunitReporter : public CumulativeReporterBase<JunitReporter> {
    public:
        JunitReporter(ReporterConfig const& _config);

        ~JunitReporter() override;

        static std::string getDescription();

        void noMatchingTestCases(std::string const& /*spec*/) override;

        void testRunStarting(TestRunInfo const& runInfo) override;

        void testGroupStarting(GroupInfo const& groupInfo) override;

        void testCaseStarting(TestCaseInfo const& testCaseInfo) override;
        bool assertionEnded(AssertionStats const& assertionStats) override;

        void testCaseEnded(TestCaseStats const& testCaseStats) override;

        void testGroupEnded(TestGroupStats const& testGroupStats) override;

        void testRunEndedCumulative() override;

        void writeGroup(TestGroupNode const& groupNode, double suiteTime);

        void writeTestCase(TestCaseNode const& testCaseNode);

        void writeSection(std::string const& className,
                          std::string const& rootName,
                          SectionNode const& sectionNode,
                          bool testOkToFail);

        void writeAssertions(SectionNode const& sectionNode);
        void writeAssertion(AssertionStats const& stats);

        XmlWriter xml;
        Timer suiteTimer;
        std::string stdOutForSuite;
        std::string stdErrForSuite;
        unsigned int unexpectedExceptions = 0;
        bool m_okToFail = false;
    };

} // end namespace Catch

// end catch_reporter_junit.h
// start catch_reporter_xml.h

namespace Catch {
    class XmlReporter : public StreamingReporterBase<XmlReporter> {
    public:
        XmlReporter(ReporterConfig const& _config);

        ~XmlReporter() override;

        static std::string getDescription();

        virtual std::string getStylesheetRef() const;

        void writeSourceInfo(SourceLineInfo const& sourceInfo);

    public: // StreamingReporterBase
        void noMatchingTestCases(std::string const& s) override;

        void testRunStarting(TestRunInfo const& testInfo) override;

        void testGroupStarting(GroupInfo const& groupInfo) override;

        void testCaseStarting(TestCaseInfo const& testInfo) override;

        void sectionStarting(SectionInfo const& sectionInfo) override;

        void assertionStarting(AssertionInfo const&) override;

        bool assertionEnded(AssertionStats const& assertionStats) override;

        void sectionEnded(SectionStats const& sectionStats) override;

        void testCaseEnded(TestCaseStats const& testCaseStats) override;

        void testGroupEnded(TestGroupStats const& testGroupStats) override;

        void testRunEnded(TestRunStats const& testRunStats) override;

#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
        void benchmarkPreparing(std::string const& name) override;
        void benchmarkStarting(BenchmarkInfo const&) override;
        void benchmarkEnded(BenchmarkStats<> const&) override;
        void benchmarkFailed(std::string const&) override;
#endif // CATCH_CONFIG_ENABLE_BENCHMARKING

    private:
        Timer m_testCaseTimer;
        XmlWriter m_xml;
        int m_sectionDepth = 0;
    };

} // end namespace Catch

// end catch_reporter_xml.h

// end catch_external_interfaces.h
#endif

#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
// start catch_benchmarking_all.hpp

// A proxy header that includes all of the benchmarking headers to allow
// concise include of the benchmarking features. You should prefer the
// individual includes in standard use.

// start catch_benchmark.hpp

// Benchmark

// start catch_chronometer.hpp

// User-facing chronometer

// start catch_clock.hpp

// Clocks

#include <chrono>
#include <ratio>

namespace Catch {
    namespace Benchmark {
        template <typename Clock> using ClockDuration = typename Clock::duration;
        template <typename Clock>
        using FloatDuration = std::chrono::duration<double, typename Clock::period>;

        template <typename Clock> using TimePoint = typename Clock::time_point;

        using default_clock = std::chrono::steady_clock;

        template <typename Clock> struct now {
            TimePoint<Clock> operator()() const { return Clock::now(); }
        };

        using fp_seconds = std::chrono::duration<double, std::ratio<1>>;
    } // namespace Benchmark
} // namespace Catch

// end catch_clock.hpp
// start catch_optimizer.hpp

// Hinting the optimizer

#if defined(_MSC_VER)
#include <atomic> // atomic_thread_fence
#endif

namespace Catch {
    namespace Benchmark {
#if defined(__GNUC__) || defined(__clang__)
        template <typename T> inline void keep_memory(T* p) {
            asm volatile("" : : "g"(p) : "memory");
        }
        inline void keep_memory() { asm volatile("" : : : "memory"); }

        namespace Detail {
            inline void optimizer_barrier() { keep_memory(); }
        } // namespace Detail
#elif defined(_MSC_VER)

#pragma optimize("", off)
        template <typename T> inline void keep_memory(T* p) {
            // thanks @milleniumbug
            *reinterpret_cast<char volatile*>(p) = *reinterpret_cast<char const volatile*>(p);
        }
        // TODO equivalent keep_memory()
#pragma optimize("", on)

        namespace Detail {
            inline void optimizer_barrier() { std::atomic_thread_fence(std::memory_order_seq_cst); }
        } // namespace Detail

#endif

        template <typename T> inline void deoptimize_value(T&& x) { keep_memory(&x); }

        template <typename Fn, typename... Args>
        inline auto invoke_deoptimized(Fn&& fn, Args&&... args) ->
            typename std::enable_if<!std::is_same<void, decltype(fn(args...))>::value>::type {
            deoptimize_value(std::forward<Fn>(fn)(std::forward<Args...>(args...)));
        }

        template <typename Fn, typename... Args>
        inline auto invoke_deoptimized(Fn&& fn, Args&&... args) ->
            typename std::enable_if<std::is_same<void, decltype(fn(args...))>::value>::type {
            std::forward<Fn>(fn)(std::forward<Args...>(args...));
        }
    } // namespace Benchmark
} // namespace Catch

// end catch_optimizer.hpp
// start catch_complete_invoke.hpp

// Invoke with a special case for void

#include <type_traits>
#include <utility>

namespace Catch {
    namespace Benchmark {
        namespace Detail {
            template <typename T> struct CompleteType { using type = T; };
            template <> struct CompleteType<void> {
                struct type {};
            };

            template <typename T> using CompleteType_t = typename CompleteType<T>::type;

            template <typename Result> struct CompleteInvoker {
                template <typename Fun, typename... Args>
                static Result invoke(Fun&& fun, Args&&... args) {
                    return std::forward<Fun>(fun)(std::forward<Args>(args)...);
                }
            };
            template <> struct CompleteInvoker<void> {
                template <typename Fun, typename... Args>
                static CompleteType_t<void> invoke(Fun&& fun, Args&&... args) {
                    std::forward<Fun>(fun)(std::forward<Args>(args)...);
                    return {};
                }
            };

            // invoke and not return void :(
            template <typename Fun, typename... Args>
            CompleteType_t<FunctionReturnType<Fun, Args...>> complete_invoke(Fun&& fun,
                                                                             Args&&... args) {
                return CompleteInvoker<FunctionReturnType<Fun, Args...>>::invoke(
                    std::forward<Fun>(fun), std::forward<Args>(args)...);
            }

            const std::string benchmarkErrorMsg = "a benchmark failed to run successfully";
        } // namespace Detail

        template <typename Fun>
        Detail::CompleteType_t<FunctionReturnType<Fun>> user_code(Fun&& fun) {
            CATCH_TRY { return Detail::complete_invoke(std::forward<Fun>(fun)); }
            CATCH_CATCH_ALL {
                getResultCapture().benchmarkFailed(translateActiveException());
                CATCH_RUNTIME_ERROR(Detail::benchmarkErrorMsg);
            }
        }
    } // namespace Benchmark
} // namespace Catch

// end catch_complete_invoke.hpp
namespace Catch {
    namespace Benchmark {
        namespace Detail {
            struct ChronometerConcept {
                virtual void start() = 0;
                virtual void finish() = 0;
                virtual ~ChronometerConcept() = default;
            };
            template <typename Clock> struct ChronometerModel final : public ChronometerConcept {
                void start() override { started = Clock::now(); }
                void finish() override { finished = Clock::now(); }

                ClockDuration<Clock> elapsed() const { return finished - started; }

                TimePoint<Clock> started;
                TimePoint<Clock> finished;
            };
        } // namespace Detail

        struct Chronometer {
        public:
            template <typename Fun> void measure(Fun&& fun) {
                measure(std::forward<Fun>(fun), is_callable<Fun(int)>());
            }

            int runs() const { return k; }

            Chronometer(Detail::ChronometerConcept& meter, int k) : impl(&meter), k(k) {}

        private:
            template <typename Fun> void measure(Fun&& fun, std::false_type) {
                measure([&fun](int) { return fun(); }, std::true_type());
            }

            template <typename Fun> void measure(Fun&& fun, std::true_type) {
                Detail::optimizer_barrier();
                impl->start();
                for (int i = 0; i < k; ++i)
                    invoke_deoptimized(fun, i);
                impl->finish();
                Detail::optimizer_barrier();
            }

            Detail::ChronometerConcept* impl;
            int k;
        };
    } // namespace Benchmark
} // namespace Catch

// end catch_chronometer.hpp
// start catch_environment.hpp

// Environment information

namespace Catch {
    namespace Benchmark {
        template <typename Duration> struct EnvironmentEstimate {
            Duration mean;
            OutlierClassification outliers;

            template <typename Duration2> operator EnvironmentEstimate<Duration2>() const {
                return {mean, outliers};
            }
        };
        template <typename Clock> struct Environment {
            using clock_type = Clock;
            EnvironmentEstimate<FloatDuration<Clock>> clock_resolution;
            EnvironmentEstimate<FloatDuration<Clock>> clock_cost;
        };
    } // namespace Benchmark
} // namespace Catch

// end catch_environment.hpp
// start catch_execution_plan.hpp

// Execution plan

// start catch_benchmark_function.hpp

// Dumb std::function implementation for consistent call overhead

#include <cassert>
#include <type_traits>
#include <utility>
#include <memory>

namespace Catch {
    namespace Benchmark {
        namespace Detail {
            template <typename T> using Decay = typename std::decay<T>::type;
            template <typename T, typename U>
            struct is_related : std::is_same<Decay<T>, Decay<U>> {};

            /// We need to reinvent std::function because every piece of code
            /// that might add overhead in a measurement context needs to have
            /// consistent performance characteristics so that we can account
            /// for it in the measurement. Implementations of std::function with
            /// optimizations that aren't always applicable, like small buffer
            /// optimizations, are not uncommon. This is effectively an
            /// implementation of std::function without any such optimizations;
            /// it may be slow, but it is consistently slow.
            struct BenchmarkFunction {
            private:
                struct callable {
                    virtual void call(Chronometer meter) const = 0;
                    virtual callable* clone() const = 0;
                    virtual ~callable() = default;
                };
                template <typename Fun> struct model : public callable {
                    model(Fun&& fun) : fun(std::move(fun)) {}
                    model(Fun const& fun) : fun(fun) {}

                    model<Fun>* clone() const override { return new model<Fun>(*this); }

                    void call(Chronometer meter) const override {
                        call(meter, is_callable<Fun(Chronometer)>());
                    }
                    void call(Chronometer meter, std::true_type) const { fun(meter); }
                    void call(Chronometer meter, std::false_type) const { meter.measure(fun); }

                    Fun fun;
                };

                struct do_nothing {
                    void operator()() const {}
                };

                template <typename T> BenchmarkFunction(model<T>* c) : f(c) {}

            public:
                BenchmarkFunction() : f(new model<do_nothing>{{}}) {}

                template <typename Fun,
                          typename std::enable_if<!is_related<Fun, BenchmarkFunction>::value,
                                                  int>::type = 0>
                BenchmarkFunction(Fun&& fun) :
                    f(new model<typename std::decay<Fun>::type>(std::forward<Fun>(fun))) {}

                BenchmarkFunction(BenchmarkFunction&& that) : f(std::move(that.f)) {}

                BenchmarkFunction(BenchmarkFunction const& that) : f(that.f->clone()) {}

                BenchmarkFunction& operator=(BenchmarkFunction&& that) {
                    f = std::move(that.f);
                    return *this;
                }

                BenchmarkFunction& operator=(BenchmarkFunction const& that) {
                    f.reset(that.f->clone());
                    return *this;
                }

                void operator()(Chronometer meter) const { f->call(meter); }

            private:
                std::unique_ptr<callable> f;
            };
        } // namespace Detail
    }     // namespace Benchmark
} // namespace Catch

// end catch_benchmark_function.hpp
// start catch_repeat.hpp

// repeat algorithm

#include <type_traits>
#include <utility>

namespace Catch {
    namespace Benchmark {
        namespace Detail {
            template <typename Fun> struct repeater {
                void operator()(int k) const {
                    for (int i = 0; i < k; ++i) {
                        fun();
                    }
                }
                Fun fun;
            };
            template <typename Fun> repeater<typename std::decay<Fun>::type> repeat(Fun&& fun) {
                return {std::forward<Fun>(fun)};
            }
        } // namespace Detail
    }     // namespace Benchmark
} // namespace Catch

// end catch_repeat.hpp
// start catch_run_for_at_least.hpp

// Run a function for a minimum amount of time

// start catch_measure.hpp

// Measure

// start catch_timing.hpp

// Timing

#include <tuple>
#include <type_traits>

namespace Catch {
    namespace Benchmark {
        template <typename Duration, typename Result> struct Timing {
            Duration elapsed;
            Result result;
            int iterations;
        };
        template <typename Clock, typename Func, typename... Args>
        using TimingOf =
            Timing<ClockDuration<Clock>, Detail::CompleteType_t<FunctionReturnType<Func, Args...>>>;
    } // namespace Benchmark
} // namespace Catch

// end catch_timing.hpp
#include <utility>

namespace Catch {
    namespace Benchmark {
        namespace Detail {
            template <typename Clock, typename Fun, typename... Args>
            TimingOf<Clock, Fun, Args...> measure(Fun&& fun, Args&&... args) {
                auto start = Clock::now();
                auto&& r = Detail::complete_invoke(fun, std::forward<Args>(args)...);
                auto end = Clock::now();
                auto delta = end - start;
                return {delta, std::forward<decltype(r)>(r), 1};
            }
        } // namespace Detail
    }     // namespace Benchmark
} // namespace Catch

// end catch_measure.hpp
#include <utility>
#include <type_traits>

namespace Catch {
    namespace Benchmark {
        namespace Detail {
            template <typename Clock, typename Fun>
            TimingOf<Clock, Fun, int> measure_one(Fun&& fun, int iters, std::false_type) {
                return Detail::measure<Clock>(fun, iters);
            }
            template <typename Clock, typename Fun>
            TimingOf<Clock, Fun, Chronometer> measure_one(Fun&& fun, int iters, std::true_type) {
                Detail::ChronometerModel<Clock> meter;
                auto&& result = Detail::complete_invoke(fun, Chronometer(meter, iters));

                return {meter.elapsed(), std::move(result), iters};
            }

            template <typename Clock, typename Fun>
            using run_for_at_least_argument_t = typename std::
                conditional<is_callable<Fun(Chronometer)>::value, Chronometer, int>::type;

            struct optimized_away_error : std::exception {
                const char* what() const noexcept override {
                    return "could not measure benchmark, maybe it was "
                           "optimized away";
                }
            };

            template <typename Clock, typename Fun>
            TimingOf<Clock, Fun, run_for_at_least_argument_t<Clock, Fun>>
            run_for_at_least(ClockDuration<Clock> how_long, int seed, Fun&& fun) {
                auto iters = seed;
                while (iters < (1 << 30)) {
                    auto&& Timing = measure_one<Clock>(fun, iters, is_callable<Fun(Chronometer)>());

                    if (Timing.elapsed >= how_long) {
                        return {Timing.elapsed, std::move(Timing.result), iters};
                    }
                    iters *= 2;
                }
                Catch::throw_exception(optimized_away_error{});
            }
        } // namespace Detail
    }     // namespace Benchmark
} // namespace Catch

// end catch_run_for_at_least.hpp
#include <algorithm>
#include <iterator>

namespace Catch {
    namespace Benchmark {
        template <typename Duration> struct ExecutionPlan {
            int iterations_per_sample;
            Duration estimated_duration;
            Detail::BenchmarkFunction benchmark;
            Duration warmup_time;
            int warmup_iterations;

            template <typename Duration2> operator ExecutionPlan<Duration2>() const {
                return {iterations_per_sample,
                        estimated_duration,
                        benchmark,
                        warmup_time,
                        warmup_iterations};
            }

            template <typename Clock>
            std::vector<FloatDuration<Clock>> run(const IConfig& cfg,
                                                  Environment<FloatDuration<Clock>> env) const {
                // warmup a bit
                Detail::run_for_at_least<Clock>(
                    std::chrono::duration_cast<ClockDuration<Clock>>(warmup_time),
                    warmup_iterations,
                    Detail::repeat(now<Clock>{}));

                std::vector<FloatDuration<Clock>> times;
                times.reserve(cfg.benchmarkSamples());
                std::generate_n(std::back_inserter(times), cfg.benchmarkSamples(), [this, env] {
                    Detail::ChronometerModel<Clock> model;
                    this->benchmark(Chronometer(model, iterations_per_sample));
                    auto sample_time = model.elapsed() - env.clock_cost.mean;
                    if (sample_time < FloatDuration<Clock>::zero())
                        sample_time = FloatDuration<Clock>::zero();
                    return sample_time / iterations_per_sample;
                });
                return times;
            }
        };
    } // namespace Benchmark
} // namespace Catch

// end catch_execution_plan.hpp
// start catch_estimate_clock.hpp

// Environment measurement

// start catch_stats.hpp

// Statistical analysis tools

#include <algorithm>
#include <functional>
#include <vector>
#include <iterator>
#include <numeric>
#include <tuple>
#include <cmath>
#include <utility>
#include <cstddef>
#include <random>

namespace Catch {
    namespace Benchmark {
        namespace Detail {
            using sample = std::vector<double>;

            double weighted_average_quantile(int k,
                                             int q,
                                             std::vector<double>::iterator first,
                                             std::vector<double>::iterator last);

            template <typename Iterator>
            OutlierClassification classify_outliers(Iterator first, Iterator last) {
                std::vector<double> copy(first, last);

                auto q1 = weighted_average_quantile(1, 4, copy.begin(), copy.end());
                auto q3 = weighted_average_quantile(3, 4, copy.begin(), copy.end());
                auto iqr = q3 - q1;
                auto los = q1 - (iqr * 3.);
                auto lom = q1 - (iqr * 1.5);
                auto him = q3 + (iqr * 1.5);
                auto his = q3 + (iqr * 3.);

                OutlierClassification o;
                for (; first != last; ++first) {
                    auto&& t = *first;
                    if (t < los)
                        ++o.low_severe;
                    else if (t < lom)
                        ++o.low_mild;
                    else if (t > his)
                        ++o.high_severe;
                    else if (t > him)
                        ++o.high_mild;
                    ++o.samples_seen;
                }
                return o;
            }

            template <typename Iterator> double mean(Iterator first, Iterator last) {
                auto count = last - first;
                double sum = std::accumulate(first, last, 0.);
                return sum / count;
            }

            template <typename URng, typename Iterator, typename Estimator>
            sample resample(
                URng& rng, int resamples, Iterator first, Iterator last, Estimator& estimator) {
                auto n = last - first;
                std::uniform_int_distribution<decltype(n)> dist(0, n - 1);

                sample out;
                out.reserve(resamples);
                std::generate_n(
                    std::back_inserter(out), resamples, [n, first, &estimator, &dist, &rng] {
                        std::vector<double> resampled;
                        resampled.reserve(n);
                        std::generate_n(std::back_inserter(resampled), n, [first, &dist, &rng] {
                            return first[dist(rng)];
                        });
                        return estimator(resampled.begin(), resampled.end());
                    });
                std::sort(out.begin(), out.end());
                return out;
            }

            template <typename Estimator, typename Iterator>
            sample jackknife(Estimator&& estimator, Iterator first, Iterator last) {
                auto n = last - first;
                auto second = std::next(first);
                sample results;
                results.reserve(n);

                for (auto it = first; it != last; ++it) {
                    std::iter_swap(it, first);
                    results.push_back(estimator(second, last));
                }

                return results;
            }

            inline double normal_cdf(double x) { return std::erfc(-x / std::sqrt(2.0)) / 2.0; }

            double erfc_inv(double x);

            double normal_quantile(double p);

            template <typename Iterator, typename Estimator>
            Estimate<double> bootstrap(double confidence_level,
                                       Iterator first,
                                       Iterator last,
                                       sample const& resample,
                                       Estimator&& estimator) {
                auto n_samples = last - first;

                double point = estimator(first, last);
                // Degenerate case with a single sample
                if (n_samples == 1)
                    return {point, point, point, confidence_level};

                sample jack = jackknife(estimator, first, last);
                double jack_mean = mean(jack.begin(), jack.end());
                double sum_squares, sum_cubes;
                std::tie(sum_squares, sum_cubes) =
                    std::accumulate(jack.begin(),
                                    jack.end(),
                                    std::make_pair(0., 0.),
                                    [jack_mean](std::pair<double, double> sqcb,
                                                double x) -> std::pair<double, double> {
                                        auto d = jack_mean - x;
                                        auto d2 = d * d;
                                        auto d3 = d2 * d;
                                        return {sqcb.first + d2, sqcb.second + d3};
                                    });

                double accel = sum_cubes / (6 * std::pow(sum_squares, 1.5));
                int n = static_cast<int>(resample.size());
                double prob_n = std::count_if(resample.begin(),
                                              resample.end(),
                                              [point](double x) { return x < point; }) /
                                (double)n;
                // degenerate case with uniform samples
                if (prob_n == 0)
                    return {point, point, point, confidence_level};

                double bias = normal_quantile(prob_n);
                double z1 = normal_quantile((1. - confidence_level) / 2.);

                auto cumn = [n](double x) -> int { return std::lround(normal_cdf(x) * n); };
                auto a = [bias, accel](double b) { return bias + b / (1. - accel * b); };
                double b1 = bias + z1;
                double b2 = bias - z1;
                double a1 = a(b1);
                double a2 = a(b2);
                auto lo = (std::max)(cumn(a1), 0);
                auto hi = (std::min)(cumn(a2), n - 1);

                return {point, resample[lo], resample[hi], confidence_level};
            }

            double outlier_variance(Estimate<double> mean, Estimate<double> stddev, int n);

            struct bootstrap_analysis {
                Estimate<double> mean;
                Estimate<double> standard_deviation;
                double outlier_variance;
            };

            bootstrap_analysis analyse_samples(double confidence_level,
                                               int n_resamples,
                                               std::vector<double>::iterator first,
                                               std::vector<double>::iterator last);
        } // namespace Detail
    }     // namespace Benchmark
} // namespace Catch

// end catch_stats.hpp
#include <algorithm>
#include <iterator>
#include <tuple>
#include <vector>
#include <cmath>

namespace Catch {
    namespace Benchmark {
        namespace Detail {
            template <typename Clock> std::vector<double> resolution(int k) {
                std::vector<TimePoint<Clock>> times;
                times.reserve(k + 1);
                std::generate_n(std::back_inserter(times), k + 1, now<Clock>{});

                std::vector<double> deltas;
                deltas.reserve(k);
                std::transform(std::next(times.begin()),
                               times.end(),
                               times.begin(),
                               std::back_inserter(deltas),
                               [](TimePoint<Clock> a, TimePoint<Clock> b) {
                                   return static_cast<double>((a - b).count());
                               });

                return deltas;
            }

            const auto warmup_iterations = 10000;
            const auto warmup_time = std::chrono::milliseconds(100);
            const auto minimum_ticks = 1000;
            const auto warmup_seed = 10000;
            const auto clock_resolution_estimation_time = std::chrono::milliseconds(500);
            const auto clock_cost_estimation_time_limit = std::chrono::seconds(1);
            const auto clock_cost_estimation_tick_limit = 100000;
            const auto clock_cost_estimation_time = std::chrono::milliseconds(10);
            const auto clock_cost_estimation_iterations = 10000;

            template <typename Clock> int warmup() {
                return run_for_at_least<Clock>(
                           std::chrono::duration_cast<ClockDuration<Clock>>(warmup_time),
                           warmup_seed,
                           &resolution<Clock>)
                    .iterations;
            }
            template <typename Clock>
            EnvironmentEstimate<FloatDuration<Clock>> estimate_clock_resolution(int iterations) {
                auto r = run_for_at_least<Clock>(std::chrono::duration_cast<ClockDuration<Clock>>(
                                                     clock_resolution_estimation_time),
                                                 iterations,
                                                 &resolution<Clock>)
                             .result;
                return {
                    FloatDuration<Clock>(mean(r.begin(), r.end())),
                    classify_outliers(r.begin(), r.end()),
                };
            }
            template <typename Clock>
            EnvironmentEstimate<FloatDuration<Clock>>
            estimate_clock_cost(FloatDuration<Clock> resolution) {
                auto time_limit =
                    (std::min)(resolution * clock_cost_estimation_tick_limit,
                               FloatDuration<Clock>(clock_cost_estimation_time_limit));
                auto time_clock = [](int k) {
                    return Detail::measure<Clock>([k] {
                               for (int i = 0; i < k; ++i) {
                                   volatile auto ignored = Clock::now();
                                   (void)ignored;
                               }
                           })
                        .elapsed;
                };
                time_clock(1);
                int iters = clock_cost_estimation_iterations;
                auto&& r = run_for_at_least<Clock>(
                    std::chrono::duration_cast<ClockDuration<Clock>>(clock_cost_estimation_time),
                    iters,
                    time_clock);
                std::vector<double> times;
                int nsamples = static_cast<int>(std::ceil(time_limit / r.elapsed));
                times.reserve(nsamples);
                std::generate_n(std::back_inserter(times), nsamples, [time_clock, &r] {
                    return static_cast<double>((time_clock(r.iterations) / r.iterations).count());
                });
                return {
                    FloatDuration<Clock>(mean(times.begin(), times.end())),
                    classify_outliers(times.begin(), times.end()),
                };
            }

            template <typename Clock> Environment<FloatDuration<Clock>> measure_environment() {
                static Environment<FloatDuration<Clock>>* env = nullptr;
                if (env) {
                    return *env;
                }

                auto iters = Detail::warmup<Clock>();
                auto resolution = Detail::estimate_clock_resolution<Clock>(iters);
                auto cost = Detail::estimate_clock_cost<Clock>(resolution.mean);

                env = new Environment<FloatDuration<Clock>>{resolution, cost};
                return *env;
            }
        } // namespace Detail
    }     // namespace Benchmark
} // namespace Catch

// end catch_estimate_clock.hpp
// start catch_analyse.hpp

// Run and analyse one benchmark

// start catch_sample_analysis.hpp

// Benchmark results

#include <algorithm>
#include <vector>
#include <string>
#include <iterator>

namespace Catch {
    namespace Benchmark {
        template <typename Duration> struct SampleAnalysis {
            std::vector<Duration> samples;
            Estimate<Duration> mean;
            Estimate<Duration> standard_deviation;
            OutlierClassification outliers;
            double outlier_variance;

            template <typename Duration2> operator SampleAnalysis<Duration2>() const {
                std::vector<Duration2> samples2;
                samples2.reserve(samples.size());
                std::transform(samples.begin(),
                               samples.end(),
                               std::back_inserter(samples2),
                               [](Duration d) { return Duration2(d); });
                return {
                    std::move(samples2),
                    mean,
                    standard_deviation,
                    outliers,
                    outlier_variance,
                };
            }
        };
    } // namespace Benchmark
} // namespace Catch

// end catch_sample_analysis.hpp
#include <algorithm>
#include <iterator>
#include <vector>

namespace Catch {
    namespace Benchmark {
        namespace Detail {
            template <typename Duration, typename Iterator>
            SampleAnalysis<Duration>
            analyse(const IConfig& cfg, Environment<Duration>, Iterator first, Iterator last) {
                if (!cfg.benchmarkNoAnalysis()) {
                    std::vector<double> samples;
                    samples.reserve(last - first);
                    std::transform(first, last, std::back_inserter(samples), [](Duration d) {
                        return d.count();
                    });

                    auto analysis =
                        Catch::Benchmark::Detail::analyse_samples(cfg.benchmarkConfidenceInterval(),
                                                                  cfg.benchmarkResamples(),
                                                                  samples.begin(),
                                                                  samples.end());
                    auto outliers =
                        Catch::Benchmark::Detail::classify_outliers(samples.begin(), samples.end());

                    auto wrap_estimate = [](Estimate<double> e) {
                        return Estimate<Duration>{
                            Duration(e.point),
                            Duration(e.lower_bound),
                            Duration(e.upper_bound),
                            e.confidence_interval,
                        };
                    };
                    std::vector<Duration> samples2;
                    samples2.reserve(samples.size());
                    std::transform(samples.begin(),
                                   samples.end(),
                                   std::back_inserter(samples2),
                                   [](double d) { return Duration(d); });
                    return {
                        std::move(samples2),
                        wrap_estimate(analysis.mean),
                        wrap_estimate(analysis.standard_deviation),
                        outliers,
                        analysis.outlier_variance,
                    };
                } else {
                    std::vector<Duration> samples;
                    samples.reserve(last - first);

                    Duration mean = Duration(0);
                    int i = 0;
                    for (auto it = first; it < last; ++it, ++i) {
                        samples.push_back(Duration(*it));
                        mean += Duration(*it);
                    }
                    mean /= i;

                    return {std::move(samples),
                            Estimate<Duration>{mean, mean, mean, 0.0},
                            Estimate<Duration>{Duration(0), Duration(0), Duration(0), 0.0},
                            OutlierClassification{},
                            0.0};
                }
            }
        } // namespace Detail
    }     // namespace Benchmark
} // namespace Catch

// end catch_analyse.hpp
#include <algorithm>
#include <functional>
#include <string>
#include <vector>
#include <cmath>

namespace Catch {
    namespace Benchmark {
        struct Benchmark {
            Benchmark(std::string&& name) : name(std::move(name)) {}

            template <class FUN>
            Benchmark(std::string&& name, FUN&& func) :
                fun(std::move(func)), name(std::move(name)) {}

            template <typename Clock>
            ExecutionPlan<FloatDuration<Clock>>
            prepare(const IConfig& cfg, Environment<FloatDuration<Clock>> env) const {
                auto min_time = env.clock_resolution.mean * Detail::minimum_ticks;
                auto run_time = std::max(
                    min_time,
                    std::chrono::duration_cast<decltype(min_time)>(cfg.benchmarkWarmupTime()));
                auto&& test = Detail::run_for_at_least<Clock>(
                    std::chrono::duration_cast<ClockDuration<Clock>>(run_time), 1, fun);
                int new_iters =
                    static_cast<int>(std::ceil(min_time * test.iterations / test.elapsed));
                return {new_iters,
                        test.elapsed / test.iterations * new_iters * cfg.benchmarkSamples(),
                        fun,
                        std::chrono::duration_cast<FloatDuration<Clock>>(cfg.benchmarkWarmupTime()),
                        Detail::warmup_iterations};
            }

            template <typename Clock = default_clock> void run() {
                IConfigPtr cfg = getCurrentContext().getConfig();

                auto env = Detail::measure_environment<Clock>();

                getResultCapture().benchmarkPreparing(name);
                CATCH_TRY {
                    auto plan = user_code([&] { return prepare<Clock>(*cfg, env); });

                    BenchmarkInfo info{name,
                                       plan.estimated_duration.count(),
                                       plan.iterations_per_sample,
                                       cfg->benchmarkSamples(),
                                       cfg->benchmarkResamples(),
                                       env.clock_resolution.mean.count(),
                                       env.clock_cost.mean.count()};

                    getResultCapture().benchmarkStarting(info);

                    auto samples = user_code([&] { return plan.template run<Clock>(*cfg, env); });

                    auto analysis = Detail::analyse(*cfg, env, samples.begin(), samples.end());
                    BenchmarkStats<FloatDuration<Clock>> stats{info,
                                                               analysis.samples,
                                                               analysis.mean,
                                                               analysis.standard_deviation,
                                                               analysis.outliers,
                                                               analysis.outlier_variance};
                    getResultCapture().benchmarkEnded(stats);
                }
                CATCH_CATCH_ALL {
                    if (translateActiveException() !=
                        Detail::benchmarkErrorMsg) // benchmark errors have been
                                                   // reported, otherwise
                                                   // rethrow.
                        std::rethrow_exception(std::current_exception());
                }
            }

            // sets lambda to be used in fun *and* executes benchmark!
            template <
                typename Fun,
                typename std::enable_if<!Detail::is_related<Fun, Benchmark>::value, int>::type = 0>
            Benchmark& operator=(Fun func) {
                fun = Detail::BenchmarkFunction(func);
                run();
                return *this;
            }

            explicit operator bool() { return true; }

        private:
            Detail::BenchmarkFunction fun;
            std::string name;
        };
    } // namespace Benchmark
} // namespace Catch

#define INTERNAL_CATCH_GET_1_ARG(arg1, arg2, ...) arg1
#define INTERNAL_CATCH_GET_2_ARG(arg1, arg2, ...) arg2

#define INTERNAL_CATCH_BENCHMARK(BenchmarkName, name, benchmarkIndex)                              \
    if (Catch::Benchmark::Benchmark BenchmarkName{name})                                           \
    BenchmarkName = [&](int benchmarkIndex)

#define INTERNAL_CATCH_BENCHMARK_ADVANCED(BenchmarkName, name)                                     \
    if (Catch::Benchmark::Benchmark BenchmarkName{name})                                           \
    BenchmarkName = [&]

// end catch_benchmark.hpp
// start catch_constructor.hpp

// Constructor and destructor helpers

#include <type_traits>

namespace Catch {
    namespace Benchmark {
        namespace Detail {
            template <typename T, bool Destruct> struct ObjectStorage {
                using TStorage =
                    typename std::aligned_storage<sizeof(T), std::alignment_of<T>::value>::type;

                ObjectStorage() : data() {}

                ObjectStorage(const ObjectStorage& other) { new (&data) T(other.stored_object()); }

                ObjectStorage(ObjectStorage&& other) {
                    new (&data) T(std::move(other.stored_object()));
                }

                ~ObjectStorage() { destruct_on_exit<T>(); }

                template <typename... Args> void construct(Args&&... args) {
                    new (&data) T(std::forward<Args>(args)...);
                }

                template <bool AllowManualDestruction = !Destruct>
                typename std::enable_if<AllowManualDestruction>::type destruct() {
                    stored_object().~T();
                }

            private:
                // If this is a constructor benchmark, destruct the underlying
                // object
                template <typename U>
                void destruct_on_exit(typename std::enable_if<Destruct, U>::type* = 0) {
                    destruct<true>();
                }
                // Otherwise, don't
                template <typename U>
                void destruct_on_exit(typename std::enable_if<!Destruct, U>::type* = 0) {}

                T& stored_object() { return *static_cast<T*>(static_cast<void*>(&data)); }

                T const& stored_object() const {
                    return *static_cast<T*>(static_cast<void*>(&data));
                }

                TStorage data;
            };
        } // namespace Detail

        template <typename T> using storage_for = Detail::ObjectStorage<T, true>;

        template <typename T> using destructable_object = Detail::ObjectStorage<T, false>;
    } // namespace Benchmark
} // namespace Catch

// end catch_constructor.hpp
// end catch_benchmarking_all.hpp
#endif

#endif // ! CATCH_CONFIG_IMPL_ONLY

#ifdef CATCH_IMPL
// start catch_impl.hpp

#ifdef __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wweak-vtables"
#endif

// Keep these here for external reporters
// start catch_test_case_tracker.h

#include <string>
#include <vector>
#include <memory>

namespace Catch {
    namespace TestCaseTracking {

        struct NameAndLocation {
            std::string name;
            SourceLineInfo location;

            NameAndLocation(std::string const& _name, SourceLineInfo const& _location);
            friend bool operator==(NameAndLocation const& lhs, NameAndLocation const& rhs) {
                return lhs.name == rhs.name && lhs.location == rhs.location;
            }
        };

        class ITracker;

        using ITrackerPtr = std::shared_ptr<ITracker>;

        class ITracker {
            NameAndLocation m_nameAndLocation;

        public:
            ITracker(NameAndLocation const& nameAndLoc) : m_nameAndLocation(nameAndLoc) {}

            // static queries
            NameAndLocation const& nameAndLocation() const { return m_nameAndLocation; }

            virtual ~ITracker();

            // dynamic queries
            virtual bool isComplete() const = 0; // Successfully completed or failed
            virtual bool isSuccessfullyCompleted() const = 0;
            virtual bool isOpen() const = 0; // Started but not complete
            virtual bool hasChildren() const = 0;
            virtual bool hasStarted() const = 0;

            virtual ITracker& parent() = 0;

            // actions
            virtual void close() = 0; // Successfully complete
            virtual void fail() = 0;
            virtual void markAsNeedingAnotherRun() = 0;

            virtual void addChild(ITrackerPtr const& child) = 0;
            virtual ITrackerPtr findChild(NameAndLocation const& nameAndLocation) = 0;
            virtual void openChild() = 0;

            // Debug/ checking
            virtual bool isSectionTracker() const = 0;
            virtual bool isGeneratorTracker() const = 0;
        };

        class TrackerContext {

            enum RunState { NotStarted, Executing, CompletedCycle };

            ITrackerPtr m_rootTracker;
            ITracker* m_currentTracker = nullptr;
            RunState m_runState = NotStarted;

        public:
            ITracker& startRun();
            void endRun();

            void startCycle();
            void completeCycle();

            bool completedCycle() const;
            ITracker& currentTracker();
            void setCurrentTracker(ITracker* tracker);
        };

        class TrackerBase : public ITracker {
        protected:
            enum CycleState {
                NotStarted,
                Executing,
                ExecutingChildren,
                NeedsAnotherRun,
                CompletedSuccessfully,
                Failed
            };

            using Children = std::vector<ITrackerPtr>;
            TrackerContext& m_ctx;
            ITracker* m_parent;
            Children m_children;
            CycleState m_runState = NotStarted;

        public:
            TrackerBase(NameAndLocation const& nameAndLocation,
                        TrackerContext& ctx,
                        ITracker* parent);

            bool isComplete() const override;
            bool isSuccessfullyCompleted() const override;
            bool isOpen() const override;
            bool hasChildren() const override;
            bool hasStarted() const override { return m_runState != NotStarted; }

            void addChild(ITrackerPtr const& child) override;

            ITrackerPtr findChild(NameAndLocation const& nameAndLocation) override;
            ITracker& parent() override;

            void openChild() override;

            bool isSectionTracker() const override;
            bool isGeneratorTracker() const override;

            void open();

            void close() override;
            void fail() override;
            void markAsNeedingAnotherRun() override;

        private:
            void moveToParent();
            void moveToThis();
        };

        class SectionTracker : public TrackerBase {
            std::vector<std::string> m_filters;
            std::string m_trimmed_name;

        public:
            SectionTracker(NameAndLocation const& nameAndLocation,
                           TrackerContext& ctx,
                           ITracker* parent);

            bool isSectionTracker() const override;

            bool isComplete() const override;

            static SectionTracker& acquire(TrackerContext& ctx,
                                           NameAndLocation const& nameAndLocation);

            void tryOpen();

            void addInitialFilters(std::vector<std::string> const& filters);
            void addNextFilters(std::vector<std::string> const& filters);
            //! Returns filters active in this tracker
            std::vector<std::string> const& getFilters() const;
            //! Returns whitespace-trimmed name of the tracked section
            std::string const& trimmedName() const;
        };

    } // namespace TestCaseTracking

    using TestCaseTracking::ITracker;
    using TestCaseTracking::SectionTracker;
    using TestCaseTracking::TrackerContext;

} // namespace Catch

// end catch_test_case_tracker.h

// start catch_leak_detector.h

namespace Catch {

    struct LeakDetector {
        LeakDetector();
        ~LeakDetector();
    };

} // namespace Catch
// end catch_leak_detector.h
// Cpp files will be included in the single-header file here
// start catch_stats.cpp

// Statistical analysis tools

#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)

#include <cassert>
#include <random>

#if defined(CATCH_CONFIG_USE_ASYNC)
#include <future>
#endif

namespace {
    double erf_inv(double x) {
        // Code accompanying the article "Approximating the erfinv function" in
        // GPU Computing Gems, Volume 2
        double w, p;

        w = -log((1.0 - x) * (1.0 + x));

        if (w < 6.250000) {
            w = w - 3.125000;
            p = -3.6444120640178196996e-21;
            p = -1.685059138182016589e-19 + p * w;
            p = 1.2858480715256400167e-18 + p * w;
            p = 1.115787767802518096e-17 + p * w;
            p = -1.333171662854620906e-16 + p * w;
            p = 2.0972767875968561637e-17 + p * w;
            p = 6.6376381343583238325e-15 + p * w;
            p = -4.0545662729752068639e-14 + p * w;
            p = -8.1519341976054721522e-14 + p * w;
            p = 2.6335093153082322977e-12 + p * w;
            p = -1.2975133253453532498e-11 + p * w;
            p = -5.4154120542946279317e-11 + p * w;
            p = 1.051212273321532285e-09 + p * w;
            p = -4.1126339803469836976e-09 + p * w;
            p = -2.9070369957882005086e-08 + p * w;
            p = 4.2347877827932403518e-07 + p * w;
            p = -1.3654692000834678645e-06 + p * w;
            p = -1.3882523362786468719e-05 + p * w;
            p = 0.0001867342080340571352 + p * w;
            p = -0.00074070253416626697512 + p * w;
            p = -0.0060336708714301490533 + p * w;
            p = 0.24015818242558961693 + p * w;
            p = 1.6536545626831027356 + p * w;
        } else if (w < 16.000000) {
            w = sqrt(w) - 3.250000;
            p = 2.2137376921775787049e-09;
            p = 9.0756561938885390979e-08 + p * w;
            p = -2.7517406297064545428e-07 + p * w;
            p = 1.8239629214389227755e-08 + p * w;
            p = 1.5027403968909827627e-06 + p * w;
            p = -4.013867526981545969e-06 + p * w;
            p = 2.9234449089955446044e-06 + p * w;
            p = 1.2475304481671778723e-05 + p * w;
            p = -4.7318229009055733981e-05 + p * w;
            p = 6.8284851459573175448e-05 + p * w;
            p = 2.4031110387097893999e-05 + p * w;
            p = -0.0003550375203628474796 + p * w;
            p = 0.00095328937973738049703 + p * w;
            p = -0.0016882755560235047313 + p * w;
            p = 0.0024914420961078508066 + p * w;
            p = -0.0037512085075692412107 + p * w;
            p = 0.005370914553590063617 + p * w;
            p = 1.0052589676941592334 + p * w;
            p = 3.0838856104922207635 + p * w;
        } else {
            w = sqrt(w) - 5.000000;
            p = -2.7109920616438573243e-11;
            p = -2.5556418169965252055e-10 + p * w;
            p = 1.5076572693500548083e-09 + p * w;
            p = -3.7894654401267369937e-09 + p * w;
            p = 7.6157012080783393804e-09 + p * w;
            p = -1.4960026627149240478e-08 + p * w;
            p = 2.9147953450901080826e-08 + p * w;
            p = -6.7711997758452339498e-08 + p * w;
            p = 2.2900482228026654717e-07 + p * w;
            p = -9.9298272942317002539e-07 + p * w;
            p = 4.5260625972231537039e-06 + p * w;
            p = -1.9681778105531670567e-05 + p * w;
            p = 7.5995277030017761139e-05 + p * w;
            p = -0.00021503011930044477347 + p * w;
            p = -0.00013871931833623122026 + p * w;
            p = 1.0103004648645343977 + p * w;
            p = 4.8499064014085844221 + p * w;
        }
        return p * x;
    }

    double standard_deviation(std::vector<double>::iterator first,
                              std::vector<double>::iterator last) {
        auto m = Catch::Benchmark::Detail::mean(first, last);
        double variance = std::accumulate(first,
                                          last,
                                          0.,
                                          [m](double a, double b) {
                                              double diff = b - m;
                                              return a + diff * diff;
                                          }) /
                          (last - first);
        return std::sqrt(variance);
    }

} // namespace

namespace Catch {
    namespace Benchmark {
        namespace Detail {

            double weighted_average_quantile(int k,
                                             int q,
                                             std::vector<double>::iterator first,
                                             std::vector<double>::iterator last) {
                auto count = last - first;
                double idx = (count - 1) * k / static_cast<double>(q);
                int j = static_cast<int>(idx);
                double g = idx - j;
                std::nth_element(first, first + j, last);
                auto xj = first[j];
                if (g == 0)
                    return xj;

                auto xj1 = *std::min_element(first + (j + 1), last);
                return xj + g * (xj1 - xj);
            }

            double erfc_inv(double x) { return erf_inv(1.0 - x); }

            double normal_quantile(double p) {
                static const double ROOT_TWO = std::sqrt(2.0);

                double result = 0.0;
                assert(p >= 0 && p <= 1);
                if (p < 0 || p > 1) {
                    return result;
                }

                result = -erfc_inv(2.0 * p);
                // result *= normal distribution standard deviation (1.0) *
                // sqrt(2)
                result *= /*sd * */ ROOT_TWO;
                // result += normal disttribution mean (0)
                return result;
            }

            double outlier_variance(Estimate<double> mean, Estimate<double> stddev, int n) {
                double sb = stddev.point;
                double mn = mean.point / n;
                double mg_min = mn / 2.;
                double sg = (std::min)(mg_min / 4., sb / std::sqrt(n));
                double sg2 = sg * sg;
                double sb2 = sb * sb;

                auto c_max = [n, mn, sb2, sg2](double x) -> double {
                    double k = mn - x;
                    double d = k * k;
                    double nd = n * d;
                    double k0 = -n * nd;
                    double k1 = sb2 - n * sg2 + nd;
                    double det = k1 * k1 - 4 * sg2 * k0;
                    return (int)(-2. * k0 / (k1 + std::sqrt(det)));
                };

                auto var_out = [n, sb2, sg2](double c) {
                    double nc = n - c;
                    return (nc / n) * (sb2 - nc * sg2);
                };

                return (std::min)(var_out(1), var_out((std::min)(c_max(0.), c_max(mg_min)))) / sb2;
            }

            bootstrap_analysis analyse_samples(double confidence_level,
                                               int n_resamples,
                                               std::vector<double>::iterator first,
                                               std::vector<double>::iterator last) {
                CATCH_INTERNAL_START_WARNINGS_SUPPRESSION
                CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS
                static std::random_device entropy;
                CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION

                auto n = static_cast<int>(last - first); // seriously, one can't use integral types
                                                         // without hell in C++

                auto mean = &Detail::mean<std::vector<double>::iterator>;
                auto stddev = &standard_deviation;

#if defined(CATCH_CONFIG_USE_ASYNC)
                auto Estimate =
                    [=](double (*f)(std::vector<double>::iterator, std::vector<double>::iterator)) {
                        auto seed = entropy();
                        return std::async(std::launch::async, [=] {
                            std::mt19937 rng(seed);
                            auto resampled = resample(rng, n_resamples, first, last, f);
                            return bootstrap(confidence_level, first, last, resampled, f);
                        });
                    };

                auto mean_future = Estimate(mean);
                auto stddev_future = Estimate(stddev);

                auto mean_estimate = mean_future.get();
                auto stddev_estimate = stddev_future.get();
#else
                auto Estimate =
                    [=](double (*f)(std::vector<double>::iterator, std::vector<double>::iterator)) {
                        auto seed = entropy();
                        std::mt19937 rng(seed);
                        auto resampled = resample(rng, n_resamples, first, last, f);
                        return bootstrap(confidence_level, first, last, resampled, f);
                    };

                auto mean_estimate = Estimate(mean);
                auto stddev_estimate = Estimate(stddev);
#endif // CATCH_USE_ASYNC

                double outlier_variance =
                    Detail::outlier_variance(mean_estimate, stddev_estimate, n);

                return {mean_estimate, stddev_estimate, outlier_variance};
            }
        } // namespace Detail
    }     // namespace Benchmark
} // namespace Catch

#endif // CATCH_CONFIG_ENABLE_BENCHMARKING
// end catch_stats.cpp
// start catch_approx.cpp

#include <cmath>
#include <limits>

namespace {

    // Performs equivalent check of std::fabs(lhs - rhs) <= margin
    // But without the subtraction to allow for INFINITY in comparison
    bool marginComparison(double lhs, double rhs, double margin) {
        return (lhs + margin >= rhs) && (rhs + margin >= lhs);
    }

} // namespace

namespace Catch {
    namespace Detail {

        Approx::Approx(double value) :
            m_epsilon(std::numeric_limits<float>::epsilon() * 100),
            m_margin(0.0),
            m_scale(0.0),
            m_value(value) {}

        Approx Approx::custom() { return Approx(0); }

        Approx Approx::operator-() const {
            auto temp(*this);
            temp.m_value = -temp.m_value;
            return temp;
        }

        std::string Approx::toString() const {
            ReusableStringStream rss;
            rss << "Approx( " << ::Catch::Detail::stringify(m_value) << " )";
            return rss.str();
        }

        bool Approx::equalityComparisonImpl(const double other) const {
            // First try with fixed margin, then compute margin based on
            // epsilon, scale and Approx's value Thanks to Richard Harris for
            // his help refining the scaled margin value
            return marginComparison(m_value, other, m_margin) ||
                   marginComparison(m_value,
                                    other,
                                    m_epsilon *
                                        (m_scale + std::fabs(std::isinf(m_value) ? 0 : m_value)));
        }

        void Approx::setMargin(double newMargin) {
            CATCH_ENFORCE(newMargin >= 0,
                          "Invalid Approx::margin: " << newMargin << '.'
                                                     << " Approx::Margin has to be non-negative.");
            m_margin = newMargin;
        }

        void Approx::setEpsilon(double newEpsilon) {
            CATCH_ENFORCE(newEpsilon >= 0 && newEpsilon <= 1.0,
                          "Invalid Approx::epsilon: " << newEpsilon << '.'
                                                      << " Approx::epsilon has to be in [0, 1]");
            m_epsilon = newEpsilon;
        }

    } // end namespace Detail

    namespace literals {
        Detail::Approx operator"" _a(long double val) { return Detail::Approx(val); }
        Detail::Approx operator"" _a(unsigned long long val) { return Detail::Approx(val); }
    } // end namespace literals

    std::string StringMaker<Catch::Detail::Approx>::convert(Catch::Detail::Approx const& value) {
        return value.toString();
    }

} // end namespace Catch
// end catch_approx.cpp
// start catch_assertionhandler.cpp

// start catch_debugger.h

namespace Catch {
    bool isDebuggerActive();
}

#ifdef CATCH_PLATFORM_MAC

#if defined(__i386__) || defined(__x86_64__)
#define CATCH_TRAP() __asm__("int $3\n" : :) /* NOLINT */
#elif defined(__aarch64__)
#define CATCH_TRAP() __asm__(".inst 0xd4200000")
#endif

#elif defined(CATCH_PLATFORM_IPHONE)

// use inline assembler
#if defined(__i386__) || defined(__x86_64__)
#define CATCH_TRAP() __asm__("int $3")
#elif defined(__aarch64__)
#define CATCH_TRAP() __asm__(".inst 0xd4200000")
#elif defined(__arm__) && !defined(__thumb__)
#define CATCH_TRAP() __asm__(".inst 0xe7f001f0")
#elif defined(__arm__) && defined(__thumb__)
#define CATCH_TRAP() __asm__(".inst 0xde01")
#endif

#elif defined(CATCH_PLATFORM_LINUX)
// If we can use inline assembler, do it because this allows us to break
// directly at the location of the failing check instead of breaking inside
// raise() called from it, i.e. one stack frame below.
#if defined(__GNUC__) && (defined(__i386) || defined(__x86_64))
#define CATCH_TRAP() asm volatile("int $3") /* NOLINT */
#else                                       // Fall back to the generic way.
#include <signal.h>

#define CATCH_TRAP() raise(SIGTRAP)
#endif
#elif defined(_MSC_VER)
#define CATCH_TRAP() __debugbreak()
#elif defined(__MINGW32__)
extern "C" __declspec(dllimport) void __stdcall DebugBreak();
#define CATCH_TRAP() DebugBreak()
#endif

#ifndef CATCH_BREAK_INTO_DEBUGGER
#ifdef CATCH_TRAP
#define CATCH_BREAK_INTO_DEBUGGER()                                                                \
    [] {                                                                                           \
        if (Catch::isDebuggerActive()) {                                                           \
            CATCH_TRAP();                                                                          \
        }                                                                                          \
    }()
#else
#define CATCH_BREAK_INTO_DEBUGGER() [] {}()
#endif
#endif

// end catch_debugger.h
// start catch_run_context.h

// start catch_fatal_condition.h

#include <cassert>

namespace Catch {

    // Wrapper for platform-specific fatal error (signals/SEH) handlers
    //
    // Tries to be cooperative with other handlers, and not step over
    // other handlers. This means that unknown structured exceptions
    // are passed on, previous signal handlers are called, and so on.
    //
    // Can only be instantiated once, and assumes that once a signal
    // is caught, the binary will end up terminating. Thus, there
    class FatalConditionHandler {
        bool m_started = false;

        // Install/disengage implementation for specific platform.
        // Should be if-defed to work on current platform, can assume
        // engage-disengage 1:1 pairing.
        void engage_platform();
        void disengage_platform();

    public:
        // Should also have platform-specific implementations as needed
        FatalConditionHandler();
        ~FatalConditionHandler();

        void engage() {
            assert(!m_started && "Handler cannot be installed twice.");
            m_started = true;
            engage_platform();
        }

        void disengage() {
            assert(m_started && "Handler cannot be uninstalled without being installed first");
            m_started = false;
            disengage_platform();
        }
    };

    //! Simple RAII guard for (dis)engaging the FatalConditionHandler
    class FatalConditionHandlerGuard {
        FatalConditionHandler* m_handler;

    public:
        FatalConditionHandlerGuard(FatalConditionHandler* handler) : m_handler(handler) {
            m_handler->engage();
        }
        ~FatalConditionHandlerGuard() { m_handler->disengage(); }
    };

} // end namespace Catch

// end catch_fatal_condition.h
#include <string>

namespace Catch {

    struct IMutableContext;

    ///////////////////////////////////////////////////////////////////////////

    class RunContext : public IResultCapture, public IRunner {

    public:
        RunContext(RunContext const&) = delete;
        RunContext& operator=(RunContext const&) = delete;

        explicit RunContext(IConfigPtr const& _config, IStreamingReporterPtr&& reporter);

        ~RunContext() override;

        void testGroupStarting(std::string const& testSpec,
                               std::size_t groupIndex,
                               std::size_t groupsCount);
        void testGroupEnded(std::string const& testSpec,
                            Totals const& totals,
                            std::size_t groupIndex,
                            std::size_t groupsCount);

        Totals runTest(TestCase const& testCase);

        IConfigPtr config() const;
        IStreamingReporter& reporter() const;

    public: // IResultCapture
        // Assertion handlers
        void handleExpr(AssertionInfo const& info,
                        ITransientExpression const& expr,
                        AssertionReaction& reaction) override;
        void handleMessage(AssertionInfo const& info,
                           ResultWas::OfType resultType,
                           StringRef const& message,
                           AssertionReaction& reaction) override;
        void handleUnexpectedExceptionNotThrown(AssertionInfo const& info,
                                                AssertionReaction& reaction) override;
        void handleUnexpectedInflightException(AssertionInfo const& info,
                                               std::string const& message,
                                               AssertionReaction& reaction) override;
        void handleIncomplete(AssertionInfo const& info) override;
        void handleNonExpr(AssertionInfo const& info,
                           ResultWas::OfType resultType,
                           AssertionReaction& reaction) override;

        bool sectionStarted(SectionInfo const& sectionInfo, Counts& assertions) override;

        void sectionEnded(SectionEndInfo const& endInfo) override;
        void sectionEndedEarly(SectionEndInfo const& endInfo) override;

        auto acquireGeneratorTracker(StringRef generatorName, SourceLineInfo const& lineInfo)
            -> IGeneratorTracker& override;

#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
        void benchmarkPreparing(std::string const& name) override;
        void benchmarkStarting(BenchmarkInfo const& info) override;
        void benchmarkEnded(BenchmarkStats<> const& stats) override;
        void benchmarkFailed(std::string const& error) override;
#endif // CATCH_CONFIG_ENABLE_BENCHMARKING

        void pushScopedMessage(MessageInfo const& message) override;
        void popScopedMessage(MessageInfo const& message) override;

        void emplaceUnscopedMessage(MessageBuilder const& builder) override;

        std::string getCurrentTestName() const override;

        const AssertionResult* getLastResult() const override;

        void exceptionEarlyReported() override;

        void handleFatalErrorCondition(StringRef message) override;

        bool lastAssertionPassed() override;

        void assertionPassed() override;

    public:
        // !TBD We need to do this another way!
        bool aborting() const final;

    private:
        void runCurrentTest(std::string& redirectedCout, std::string& redirectedCerr);
        void invokeActiveTestCase();

        void resetAssertionInfo();
        bool testForMissingAssertions(Counts& assertions);

        void assertionEnded(AssertionResult const& result);
        void reportExpr(AssertionInfo const& info,
                        ResultWas::OfType resultType,
                        ITransientExpression const* expr,
                        bool negated);

        void populateReaction(AssertionReaction& reaction);

    private:
        void handleUnfinishedSections();

        TestRunInfo m_runInfo;
        IMutableContext& m_context;
        TestCase const* m_activeTestCase = nullptr;
        ITracker* m_testCaseTracker = nullptr;
        Option<AssertionResult> m_lastResult;

        IConfigPtr m_config;
        Totals m_totals;
        IStreamingReporterPtr m_reporter;
        std::vector<MessageInfo> m_messages;
        std::vector<ScopedMessage>
            m_messageScopes; /* Keeps owners of so-called unscoped messages. */
        AssertionInfo m_lastAssertionInfo;
        std::vector<SectionEndInfo> m_unfinishedSections;
        std::vector<ITracker*> m_activeSections;
        TrackerContext m_trackerContext;
        FatalConditionHandler m_fatalConditionhandler;
        bool m_lastAssertionPassed = false;
        bool m_shouldReportUnexpected = true;
        bool m_includeSuccessfulResults;
    };

    void seedRng(IConfig const& config);
    unsigned int rngSeed();
} // end namespace Catch

// end catch_run_context.h
namespace Catch {

    namespace {
        auto operator<<(std::ostream& os, ITransientExpression const& expr) -> std::ostream& {
            expr.streamReconstructedExpression(os);
            return os;
        }
    } // namespace

    LazyExpression::LazyExpression(bool isNegated) : m_isNegated(isNegated) {}

    LazyExpression::LazyExpression(LazyExpression const& other) : m_isNegated(other.m_isNegated) {}

    LazyExpression::operator bool() const { return m_transientExpression != nullptr; }

    auto operator<<(std::ostream& os, LazyExpression const& lazyExpr) -> std::ostream& {
        if (lazyExpr.m_isNegated)
            os << "!";

        if (lazyExpr) {
            if (lazyExpr.m_isNegated && lazyExpr.m_transientExpression->isBinaryExpression())
                os << "(" << *lazyExpr.m_transientExpression << ")";
            else
                os << *lazyExpr.m_transientExpression;
        } else {
            os << "{** error - unchecked empty expression requested **}";
        }
        return os;
    }

    AssertionHandler::AssertionHandler(StringRef const& macroName,
                                       SourceLineInfo const& lineInfo,
                                       StringRef capturedExpression,
                                       ResultDisposition::Flags resultDisposition) :
        m_assertionInfo{macroName, lineInfo, capturedExpression, resultDisposition},
        m_resultCapture(getResultCapture()) {}

    void AssertionHandler::handleExpr(ITransientExpression const& expr) {
        m_resultCapture.handleExpr(m_assertionInfo, expr, m_reaction);
    }
    void AssertionHandler::handleMessage(ResultWas::OfType resultType, StringRef const& message) {
        m_resultCapture.handleMessage(m_assertionInfo, resultType, message, m_reaction);
    }

    auto AssertionHandler::allowThrows() const -> bool {
        return getCurrentContext().getConfig()->allowThrows();
    }

    void AssertionHandler::complete() {
        setCompleted();
        if (m_reaction.shouldDebugBreak) {

            // If you find your debugger stopping you here then go one level up
            // on the call-stack for the code that caused it (typically a failed
            // assertion)

            // (To go back to the test and change execution, jump over the
            // throw, next)
            CATCH_BREAK_INTO_DEBUGGER();
        }
        if (m_reaction.shouldThrow) {
#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
            throw Catch::TestFailureException();
#else
            CATCH_ERROR("Test failure requires aborting test!");
#endif
        }
    }
    void AssertionHandler::setCompleted() { m_completed = true; }

    void AssertionHandler::handleUnexpectedInflightException() {
        m_resultCapture.handleUnexpectedInflightException(
            m_assertionInfo, Catch::translateActiveException(), m_reaction);
    }

    void AssertionHandler::handleExceptionThrownAsExpected() {
        m_resultCapture.handleNonExpr(m_assertionInfo, ResultWas::Ok, m_reaction);
    }
    void AssertionHandler::handleExceptionNotThrownAsExpected() {
        m_resultCapture.handleNonExpr(m_assertionInfo, ResultWas::Ok, m_reaction);
    }

    void AssertionHandler::handleUnexpectedExceptionNotThrown() {
        m_resultCapture.handleUnexpectedExceptionNotThrown(m_assertionInfo, m_reaction);
    }

    void AssertionHandler::handleThrowingCallSkipped() {
        m_resultCapture.handleNonExpr(m_assertionInfo, ResultWas::Ok, m_reaction);
    }

    // This is the overload that takes a string and infers the Equals matcher
    // from it The more general overload, that takes any string matcher, is in
    // catch_capture_matchers.cpp
    void handleExceptionMatchExpr(AssertionHandler& handler,
                                  std::string const& str,
                                  StringRef const& matcherString) {
        handleExceptionMatchExpr(handler, Matchers::Equals(str), matcherString);
    }

} // namespace Catch
// end catch_assertionhandler.cpp
// start catch_assertionresult.cpp

namespace Catch {
    AssertionResultData::AssertionResultData(ResultWas::OfType _resultType,
                                             LazyExpression const& _lazyExpression) :
        lazyExpression(_lazyExpression), resultType(_resultType) {}

    std::string AssertionResultData::reconstructExpression() const {

        if (reconstructedExpression.empty()) {
            if (lazyExpression) {
                ReusableStringStream rss;
                rss << lazyExpression;
                reconstructedExpression = rss.str();
            }
        }
        return reconstructedExpression;
    }

    AssertionResult::AssertionResult(AssertionInfo const& info, AssertionResultData const& data) :
        m_info(info), m_resultData(data) {}

    // Result was a success
    bool AssertionResult::succeeded() const { return Catch::isOk(m_resultData.resultType); }

    // Result was a success, or failure is suppressed
    bool AssertionResult::isOk() const {
        return Catch::isOk(m_resultData.resultType) ||
               shouldSuppressFailure(m_info.resultDisposition);
    }

    ResultWas::OfType AssertionResult::getResultType() const { return m_resultData.resultType; }

    bool AssertionResult::hasExpression() const { return !m_info.capturedExpression.empty(); }

    bool AssertionResult::hasMessage() const { return !m_resultData.message.empty(); }

    std::string AssertionResult::getExpression() const {
        // Possibly overallocating by 3 characters should be basically free
        std::string expr;
        expr.reserve(m_info.capturedExpression.size() + 3);
        if (isFalseTest(m_info.resultDisposition)) {
            expr += "!(";
        }
        expr += m_info.capturedExpression;
        if (isFalseTest(m_info.resultDisposition)) {
            expr += ')';
        }
        return expr;
    }

    std::string AssertionResult::getExpressionInMacro() const {
        std::string expr;
        if (m_info.macroName.empty())
            expr = static_cast<std::string>(m_info.capturedExpression);
        else {
            expr.reserve(m_info.macroName.size() + m_info.capturedExpression.size() + 4);
            expr += m_info.macroName;
            expr += "( ";
            expr += m_info.capturedExpression;
            expr += " )";
        }
        return expr;
    }

    bool AssertionResult::hasExpandedExpression() const {
        return hasExpression() && getExpandedExpression() != getExpression();
    }

    std::string AssertionResult::getExpandedExpression() const {
        std::string expr = m_resultData.reconstructExpression();
        return expr.empty() ? getExpression() : expr;
    }

    std::string AssertionResult::getMessage() const { return m_resultData.message; }
    SourceLineInfo AssertionResult::getSourceInfo() const { return m_info.lineInfo; }

    StringRef AssertionResult::getTestMacroName() const { return m_info.macroName; }

} // end namespace Catch
// end catch_assertionresult.cpp
// start catch_capture_matchers.cpp

namespace Catch {

    using StringMatcher = Matchers::Impl::MatcherBase<std::string>;

    // This is the general overload that takes a any string matcher
    // There is another overload, in catch_assertionhandler.h/.cpp, that only
    // takes a string and infers the Equals matcher (so the header does not
    // mention matchers)
    void handleExceptionMatchExpr(AssertionHandler& handler,
                                  StringMatcher const& matcher,
                                  StringRef const& matcherString) {
        std::string exceptionMessage = Catch::translateActiveException();
        MatchExpr<std::string, StringMatcher const&> expr(exceptionMessage, matcher, matcherString);
        handler.handleExpr(expr);
    }

} // namespace Catch
// end catch_capture_matchers.cpp
// start catch_commandline.cpp

// start catch_commandline.h

// start catch_clara.h

// Use Catch's value for console width (store Clara's off to the side, if
// present)
#ifdef CLARA_CONFIG_CONSOLE_WIDTH
#define CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH
#undef CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH
#endif
#define CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH - 1

#ifdef __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wweak-vtables"
#pragma clang diagnostic ignored "-Wexit-time-destructors"
#pragma clang diagnostic ignored "-Wshadow"
#endif

// start clara.hpp
// Copyright 2017 Two Blue Cubes Ltd. All rights reserved.
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
// See https://github.com/philsquared/Clara for more details

// Clara v1.1.5

#ifndef CATCH_CLARA_CONFIG_CONSOLE_WIDTH
#define CATCH_CLARA_CONFIG_CONSOLE_WIDTH 80
#endif

#ifndef CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH
#define CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH CATCH_CLARA_CONFIG_CONSOLE_WIDTH
#endif

#ifndef CLARA_CONFIG_OPTIONAL_TYPE
#ifdef __has_include
#if __has_include(<optional>) && __cplusplus >= 201703L
#include <optional>
#define CLARA_CONFIG_OPTIONAL_TYPE std::optional
#endif
#endif
#endif

// ----------- #included from clara_textflow.hpp -----------

// TextFlowCpp
//
// A single-header library for wrapping and laying out basic text, by Phil Nash
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
// This project is hosted at https://github.com/philsquared/textflowcpp

#include <cassert>
#include <ostream>
#include <sstream>
#include <vector>

#ifndef CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH
#define CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH 80
#endif

namespace Catch {
    namespace clara {
        namespace TextFlow {

            inline auto isWhitespace(char c) -> bool {
                static std::string chars = " \t\n\r";
                return chars.find(c) != std::string::npos;
            }
            inline auto isBreakableBefore(char c) -> bool {
                static std::string chars = "[({<|";
                return chars.find(c) != std::string::npos;
            }
            inline auto isBreakableAfter(char c) -> bool {
                static std::string chars = "])}>.,:;*+-=&/\\";
                return chars.find(c) != std::string::npos;
            }

            class Columns;

            class Column {
                std::vector<std::string> m_strings;
                size_t m_width = CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH;
                size_t m_indent = 0;
                size_t m_initialIndent = std::string::npos;

            public:
                class iterator {
                    friend Column;

                    Column const& m_column;
                    size_t m_stringIndex = 0;
                    size_t m_pos = 0;

                    size_t m_len = 0;
                    size_t m_end = 0;
                    bool m_suffix = false;

                    iterator(Column const& column, size_t stringIndex) :
                        m_column(column), m_stringIndex(stringIndex) {}

                    auto line() const -> std::string const& {
                        return m_column.m_strings[m_stringIndex];
                    }

                    auto isBoundary(size_t at) const -> bool {
                        assert(at > 0);
                        assert(at <= line().size());

                        return at == line().size() ||
                               (isWhitespace(line()[at]) && !isWhitespace(line()[at - 1])) ||
                               isBreakableBefore(line()[at]) || isBreakableAfter(line()[at - 1]);
                    }

                    void calcLength() {
                        assert(m_stringIndex < m_column.m_strings.size());

                        m_suffix = false;
                        auto width = m_column.m_width - indent();
                        m_end = m_pos;
                        if (line()[m_pos] == '\n') {
                            ++m_end;
                        }
                        while (m_end < line().size() && line()[m_end] != '\n')
                            ++m_end;

                        if (m_end < m_pos + width) {
                            m_len = m_end - m_pos;
                        } else {
                            size_t len = width;
                            while (len > 0 && !isBoundary(m_pos + len))
                                --len;
                            while (len > 0 && isWhitespace(line()[m_pos + len - 1]))
                                --len;

                            if (len > 0) {
                                m_len = len;
                            } else {
                                m_suffix = true;
                                m_len = width - 1;
                            }
                        }
                    }

                    auto indent() const -> size_t {
                        auto initial = m_pos == 0 && m_stringIndex == 0 ? m_column.m_initialIndent
                                                                        : std::string::npos;
                        return initial == std::string::npos ? m_column.m_indent : initial;
                    }

                    auto addIndentAndSuffix(std::string const& plain) const -> std::string {
                        return std::string(indent(), ' ') + (m_suffix ? plain + "-" : plain);
                    }

                public:
                    using difference_type = std::ptrdiff_t;
                    using value_type = std::string;
                    using pointer = value_type*;
                    using reference = value_type&;
                    using iterator_category = std::forward_iterator_tag;

                    explicit iterator(Column const& column) : m_column(column) {
                        assert(m_column.m_width > m_column.m_indent);
                        assert(m_column.m_initialIndent == std::string::npos ||
                               m_column.m_width > m_column.m_initialIndent);
                        calcLength();
                        if (m_len == 0)
                            m_stringIndex++; // Empty string
                    }

                    auto operator*() const -> std::string {
                        assert(m_stringIndex < m_column.m_strings.size());
                        assert(m_pos <= m_end);
                        return addIndentAndSuffix(line().substr(m_pos, m_len));
                    }

                    auto operator++() -> iterator& {
                        m_pos += m_len;
                        if (m_pos < line().size() && line()[m_pos] == '\n')
                            m_pos += 1;
                        else
                            while (m_pos < line().size() && isWhitespace(line()[m_pos]))
                                ++m_pos;

                        if (m_pos == line().size()) {
                            m_pos = 0;
                            ++m_stringIndex;
                        }
                        if (m_stringIndex < m_column.m_strings.size())
                            calcLength();
                        return *this;
                    }
                    auto operator++(int) -> iterator {
                        iterator prev(*this);
                        operator++();
                        return prev;
                    }

                    auto operator==(iterator const& other) const -> bool {
                        return m_pos == other.m_pos && m_stringIndex == other.m_stringIndex &&
                               &m_column == &other.m_column;
                    }
                    auto operator!=(iterator const& other) const -> bool {
                        return !operator==(other);
                    }
                };
                using const_iterator = iterator;

                explicit Column(std::string const& text) { m_strings.push_back(text); }

                auto width(size_t newWidth) -> Column& {
                    assert(newWidth > 0);
                    m_width = newWidth;
                    return *this;
                }
                auto indent(size_t newIndent) -> Column& {
                    m_indent = newIndent;
                    return *this;
                }
                auto initialIndent(size_t newIndent) -> Column& {
                    m_initialIndent = newIndent;
                    return *this;
                }

                auto width() const -> size_t { return m_width; }
                auto begin() const -> iterator { return iterator(*this); }
                auto end() const -> iterator { return {*this, m_strings.size()}; }

                inline friend std::ostream& operator<<(std::ostream& os, Column const& col) {
                    bool first = true;
                    for (auto line : col) {
                        if (first)
                            first = false;
                        else
                            os << "\n";
                        os << line;
                    }
                    return os;
                }

                auto operator+(Column const& other) -> Columns;

                auto toString() const -> std::string {
                    std::ostringstream oss;
                    oss << *this;
                    return oss.str();
                }
            };

            class Spacer : public Column {

            public:
                explicit Spacer(size_t spaceWidth) : Column("") { width(spaceWidth); }
            };

            class Columns {
                std::vector<Column> m_columns;

            public:
                class iterator {
                    friend Columns;
                    struct EndTag {};

                    std::vector<Column> const& m_columns;
                    std::vector<Column::iterator> m_iterators;
                    size_t m_activeIterators;

                    iterator(Columns const& columns, EndTag) :
                        m_columns(columns.m_columns), m_activeIterators(0) {
                        m_iterators.reserve(m_columns.size());

                        for (auto const& col : m_columns)
                            m_iterators.push_back(col.end());
                    }

                public:
                    using difference_type = std::ptrdiff_t;
                    using value_type = std::string;
                    using pointer = value_type*;
                    using reference = value_type&;
                    using iterator_category = std::forward_iterator_tag;

                    explicit iterator(Columns const& columns) :
                        m_columns(columns.m_columns), m_activeIterators(m_columns.size()) {
                        m_iterators.reserve(m_columns.size());

                        for (auto const& col : m_columns)
                            m_iterators.push_back(col.begin());
                    }

                    auto operator==(iterator const& other) const -> bool {
                        return m_iterators == other.m_iterators;
                    }
                    auto operator!=(iterator const& other) const -> bool {
                        return m_iterators != other.m_iterators;
                    }
                    auto operator*() const -> std::string {
                        std::string row, padding;

                        for (size_t i = 0; i < m_columns.size(); ++i) {
                            auto width = m_columns[i].width();
                            if (m_iterators[i] != m_columns[i].end()) {
                                std::string col = *m_iterators[i];
                                row += padding + col;
                                if (col.size() < width)
                                    padding = std::string(width - col.size(), ' ');
                                else
                                    padding = "";
                            } else {
                                padding += std::string(width, ' ');
                            }
                        }
                        return row;
                    }
                    auto operator++() -> iterator& {
                        for (size_t i = 0; i < m_columns.size(); ++i) {
                            if (m_iterators[i] != m_columns[i].end())
                                ++m_iterators[i];
                        }
                        return *this;
                    }
                    auto operator++(int) -> iterator {
                        iterator prev(*this);
                        operator++();
                        return prev;
                    }
                };
                using const_iterator = iterator;

                auto begin() const -> iterator { return iterator(*this); }
                auto end() const -> iterator { return {*this, iterator::EndTag()}; }

                auto operator+=(Column const& col) -> Columns& {
                    m_columns.push_back(col);
                    return *this;
                }
                auto operator+(Column const& col) -> Columns {
                    Columns combined = *this;
                    combined += col;
                    return combined;
                }

                inline friend std::ostream& operator<<(std::ostream& os, Columns const& cols) {

                    bool first = true;
                    for (auto line : cols) {
                        if (first)
                            first = false;
                        else
                            os << "\n";
                        os << line;
                    }
                    return os;
                }

                auto toString() const -> std::string {
                    std::ostringstream oss;
                    oss << *this;
                    return oss.str();
                }
            };

            inline auto Column::operator+(Column const& other) -> Columns {
                Columns cols;
                cols += *this;
                cols += other;
                return cols;
            }
        } // namespace TextFlow

    } // namespace clara
} // namespace Catch

// ----------- end of #include from clara_textflow.hpp -----------
// ........... back in clara.hpp

#include <cctype>
#include <string>
#include <memory>
#include <set>
#include <algorithm>

#if !defined(CATCH_PLATFORM_WINDOWS) &&                                                            \
    (defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER))
#define CATCH_PLATFORM_WINDOWS
#endif

namespace Catch {
    namespace clara {
        namespace detail {

            // Traits for extracting arg and return type of lambdas (for single
            // argument lambdas)
            template <typename L>
            struct UnaryLambdaTraits : UnaryLambdaTraits<decltype(&L::operator())> {};

            template <typename ClassT, typename ReturnT, typename... Args>
            struct UnaryLambdaTraits<ReturnT (ClassT::*)(Args...) const> {
                static const bool isValid = false;
            };

            template <typename ClassT, typename ReturnT, typename ArgT>
            struct UnaryLambdaTraits<ReturnT (ClassT::*)(ArgT) const> {
                static const bool isValid = true;
                using ArgType =
                    typename std::remove_const<typename std::remove_reference<ArgT>::type>::type;
                using ReturnType = ReturnT;
            };

            class TokenStream;

            // Transport for raw args (copied from main args, or supplied via
            // init list for testing)
            class Args {
                friend TokenStream;
                std::string m_exeName;
                std::vector<std::string> m_args;

            public:
                Args(int argc, char const* const* argv) :
                    m_exeName(argv[0]), m_args(argv + 1, argv + argc) {}

                Args(std::initializer_list<std::string> args) :
                    m_exeName(*args.begin()), m_args(args.begin() + 1, args.end()) {}

                auto exeName() const -> std::string { return m_exeName; }
            };

            // Wraps a token coming from a token stream. These may not directly
            // correspond to strings as a single string may encode an option +
            // its argument if the : or = form is used
            enum class TokenType { Option, Argument };
            struct Token {
                TokenType type;
                std::string token;
            };

            inline auto isOptPrefix(char c) -> bool {
                return c == '-'
#ifdef CATCH_PLATFORM_WINDOWS
                       || c == '/'
#endif
                    ;
            }

            // Abstracts iterators into args as a stream of tokens, with option
            // arguments uniformly handled
            class TokenStream {
                using Iterator = std::vector<std::string>::const_iterator;
                Iterator it;
                Iterator itEnd;
                std::vector<Token> m_tokenBuffer;

                void loadBuffer() {
                    m_tokenBuffer.resize(0);

                    // Skip any empty strings
                    while (it != itEnd && it->empty())
                        ++it;

                    if (it != itEnd) {
                        auto const& next = *it;
                        if (isOptPrefix(next[0])) {
                            auto delimiterPos = next.find_first_of(" :=");
                            if (delimiterPos != std::string::npos) {
                                m_tokenBuffer.push_back(
                                    {TokenType::Option, next.substr(0, delimiterPos)});
                                m_tokenBuffer.push_back(
                                    {TokenType::Argument, next.substr(delimiterPos + 1)});
                            } else {
                                if (next[1] != '-' && next.size() > 2) {
                                    std::string opt = "- ";
                                    for (size_t i = 1; i < next.size(); ++i) {
                                        opt[1] = next[i];
                                        m_tokenBuffer.push_back({TokenType::Option, opt});
                                    }
                                } else {
                                    m_tokenBuffer.push_back({TokenType::Option, next});
                                }
                            }
                        } else {
                            m_tokenBuffer.push_back({TokenType::Argument, next});
                        }
                    }
                }

            public:
                explicit TokenStream(Args const& args) :
                    TokenStream(args.m_args.begin(), args.m_args.end()) {}

                TokenStream(Iterator it, Iterator itEnd) : it(it), itEnd(itEnd) { loadBuffer(); }

                explicit operator bool() const { return !m_tokenBuffer.empty() || it != itEnd; }

                auto count() const -> size_t { return m_tokenBuffer.size() + (itEnd - it); }

                auto operator*() const -> Token {
                    assert(!m_tokenBuffer.empty());
                    return m_tokenBuffer.front();
                }

                auto operator->() const -> Token const* {
                    assert(!m_tokenBuffer.empty());
                    return &m_tokenBuffer.front();
                }

                auto operator++() -> TokenStream& {
                    if (m_tokenBuffer.size() >= 2) {
                        m_tokenBuffer.erase(m_tokenBuffer.begin());
                    } else {
                        if (it != itEnd)
                            ++it;
                        loadBuffer();
                    }
                    return *this;
                }
            };

            class ResultBase {
            public:
                enum Type { Ok, LogicError, RuntimeError };

            protected:
                ResultBase(Type type) : m_type(type) {}
                virtual ~ResultBase() = default;

                virtual void enforceOk() const = 0;

                Type m_type;
            };

            template <typename T> class ResultValueBase : public ResultBase {
            public:
                auto value() const -> T const& {
                    enforceOk();
                    return m_value;
                }

            protected:
                ResultValueBase(Type type) : ResultBase(type) {}

                ResultValueBase(ResultValueBase const& other) : ResultBase(other) {
                    if (m_type == ResultBase::Ok)
                        new (&m_value) T(other.m_value);
                }

                ResultValueBase(Type, T const& value) : ResultBase(Ok) { new (&m_value) T(value); }

                auto operator=(ResultValueBase const& other) -> ResultValueBase& {
                    if (m_type == ResultBase::Ok)
                        m_value.~T();
                    ResultBase::operator=(other);
                    if (m_type == ResultBase::Ok)
                        new (&m_value) T(other.m_value);
                    return *this;
                }

                ~ResultValueBase() override {
                    if (m_type == Ok)
                        m_value.~T();
                }

                union {
                    T m_value;
                };
            };

            template <> class ResultValueBase<void> : public ResultBase {
            protected:
                using ResultBase::ResultBase;
            };

            template <typename T = void> class BasicResult : public ResultValueBase<T> {
            public:
                template <typename U>
                explicit BasicResult(BasicResult<U> const& other) :
                    ResultValueBase<T>(other.type()), m_errorMessage(other.errorMessage()) {
                    assert(type() != ResultBase::Ok);
                }

                template <typename U> static auto ok(U const& value) -> BasicResult {
                    return {ResultBase::Ok, value};
                }
                static auto ok() -> BasicResult { return {ResultBase::Ok}; }
                static auto logicError(std::string const& message) -> BasicResult {
                    return {ResultBase::LogicError, message};
                }
                static auto runtimeError(std::string const& message) -> BasicResult {
                    return {ResultBase::RuntimeError, message};
                }

                explicit operator bool() const { return m_type == ResultBase::Ok; }
                auto type() const -> ResultBase::Type { return m_type; }
                auto errorMessage() const -> std::string { return m_errorMessage; }

            protected:
                void enforceOk() const override {

                    // Errors shouldn't reach this point, but if they do
                    // the actual error message will be in m_errorMessage
                    assert(m_type != ResultBase::LogicError);
                    assert(m_type != ResultBase::RuntimeError);
                    if (m_type != ResultBase::Ok)
                        std::abort();
                }

                std::string m_errorMessage; // Only populated if resultType is an error

                BasicResult(ResultBase::Type type, std::string const& message) :
                    ResultValueBase<T>(type), m_errorMessage(message) {
                    assert(m_type != ResultBase::Ok);
                }

                using ResultValueBase<T>::ResultValueBase;
                using ResultBase::m_type;
            };

            enum class ParseResultType { Matched, NoMatch, ShortCircuitAll, ShortCircuitSame };

            class ParseState {
            public:
                ParseState(ParseResultType type, TokenStream const& remainingTokens) :
                    m_type(type), m_remainingTokens(remainingTokens) {}

                auto type() const -> ParseResultType { return m_type; }
                auto remainingTokens() const -> TokenStream { return m_remainingTokens; }

            private:
                ParseResultType m_type;
                TokenStream m_remainingTokens;
            };

            using Result = BasicResult<void>;
            using ParserResult = BasicResult<ParseResultType>;
            using InternalParseResult = BasicResult<ParseState>;

            struct HelpColumns {
                std::string left;
                std::string right;
            };

            template <typename T>
            inline auto convertInto(std::string const& source, T& target) -> ParserResult {
                std::stringstream ss;
                ss << source;
                ss >> target;
                if (ss.fail())
                    return ParserResult::runtimeError("Unable to convert '" + source +
                                                      "' to destination type");
                else
                    return ParserResult::ok(ParseResultType::Matched);
            }
            inline auto convertInto(std::string const& source, std::string& target)
                -> ParserResult {
                target = source;
                return ParserResult::ok(ParseResultType::Matched);
            }
            inline auto convertInto(std::string const& source, bool& target) -> ParserResult {
                std::string srcLC = source;
                std::transform(srcLC.begin(), srcLC.end(), srcLC.begin(), [](unsigned char c) {
                    return static_cast<char>(std::tolower(c));
                });
                if (srcLC == "y" || srcLC == "1" || srcLC == "true" || srcLC == "yes" ||
                    srcLC == "on")
                    target = true;
                else if (srcLC == "n" || srcLC == "0" || srcLC == "false" || srcLC == "no" ||
                         srcLC == "off")
                    target = false;
                else
                    return ParserResult::runtimeError(
                        "Expected a boolean value but did not recognise: '" + source + "'");
                return ParserResult::ok(ParseResultType::Matched);
            }
#ifdef CLARA_CONFIG_OPTIONAL_TYPE
            template <typename T>
            inline auto convertInto(std::string const& source,
                                    CLARA_CONFIG_OPTIONAL_TYPE<T>& target) -> ParserResult {
                T temp;
                auto result = convertInto(source, temp);
                if (result)
                    target = std::move(temp);
                return result;
            }
#endif // CLARA_CONFIG_OPTIONAL_TYPE

            struct NonCopyable {
                NonCopyable() = default;
                NonCopyable(NonCopyable const&) = delete;
                NonCopyable(NonCopyable&&) = delete;
                NonCopyable& operator=(NonCopyable const&) = delete;
                NonCopyable& operator=(NonCopyable&&) = delete;
            };

            struct BoundRef : NonCopyable {
                virtual ~BoundRef() = default;
                virtual auto isContainer() const -> bool { return false; }
                virtual auto isFlag() const -> bool { return false; }
            };
            struct BoundValueRefBase : BoundRef {
                virtual auto setValue(std::string const& arg) -> ParserResult = 0;
            };
            struct BoundFlagRefBase : BoundRef {
                virtual auto setFlag(bool flag) -> ParserResult = 0;
                virtual auto isFlag() const -> bool { return true; }
            };

            template <typename T> struct BoundValueRef : BoundValueRefBase {
                T& m_ref;

                explicit BoundValueRef(T& ref) : m_ref(ref) {}

                auto setValue(std::string const& arg) -> ParserResult override {
                    return convertInto(arg, m_ref);
                }
            };

            template <typename T> struct BoundValueRef<std::vector<T>> : BoundValueRefBase {
                std::vector<T>& m_ref;

                explicit BoundValueRef(std::vector<T>& ref) : m_ref(ref) {}

                auto isContainer() const -> bool override { return true; }

                auto setValue(std::string const& arg) -> ParserResult override {
                    T temp;
                    auto result = convertInto(arg, temp);
                    if (result)
                        m_ref.push_back(temp);
                    return result;
                }
            };

            struct BoundFlagRef : BoundFlagRefBase {
                bool& m_ref;

                explicit BoundFlagRef(bool& ref) : m_ref(ref) {}

                auto setFlag(bool flag) -> ParserResult override {
                    m_ref = flag;
                    return ParserResult::ok(ParseResultType::Matched);
                }
            };

            template <typename ReturnType> struct LambdaInvoker {
                static_assert(std::is_same<ReturnType, ParserResult>::value,
                              "Lambda must return void or clara::ParserResult");

                template <typename L, typename ArgType>
                static auto invoke(L const& lambda, ArgType const& arg) -> ParserResult {
                    return lambda(arg);
                }
            };

            template <> struct LambdaInvoker<void> {
                template <typename L, typename ArgType>
                static auto invoke(L const& lambda, ArgType const& arg) -> ParserResult {
                    lambda(arg);
                    return ParserResult::ok(ParseResultType::Matched);
                }
            };

            template <typename ArgType, typename L>
            inline auto invokeLambda(L const& lambda, std::string const& arg) -> ParserResult {
                ArgType temp{};
                auto result = convertInto(arg, temp);
                return !result ? result
                               : LambdaInvoker<typename UnaryLambdaTraits<L>::ReturnType>::invoke(
                                     lambda, temp);
            }

            template <typename L> struct BoundLambda : BoundValueRefBase {
                L m_lambda;

                static_assert(UnaryLambdaTraits<L>::isValid,
                              "Supplied lambda must take exactly one argument");
                explicit BoundLambda(L const& lambda) : m_lambda(lambda) {}

                auto setValue(std::string const& arg) -> ParserResult override {
                    return invokeLambda<typename UnaryLambdaTraits<L>::ArgType>(m_lambda, arg);
                }
            };

            template <typename L> struct BoundFlagLambda : BoundFlagRefBase {
                L m_lambda;

                static_assert(UnaryLambdaTraits<L>::isValid,
                              "Supplied lambda must take exactly one argument");
                static_assert(std::is_same<typename UnaryLambdaTraits<L>::ArgType, bool>::value,
                              "flags must be boolean");

                explicit BoundFlagLambda(L const& lambda) : m_lambda(lambda) {}

                auto setFlag(bool flag) -> ParserResult override {
                    return LambdaInvoker<typename UnaryLambdaTraits<L>::ReturnType>::invoke(
                        m_lambda, flag);
                }
            };

            enum class Optionality { Optional, Required };

            struct Parser;

            class ParserBase {
            public:
                virtual ~ParserBase() = default;
                virtual auto validate() const -> Result { return Result::ok(); }
                virtual auto parse(std::string const& exeName, TokenStream const& tokens) const
                    -> InternalParseResult = 0;
                virtual auto cardinality() const -> size_t { return 1; }

                auto parse(Args const& args) const -> InternalParseResult {
                    return parse(args.exeName(), TokenStream(args));
                }
            };

            template <typename DerivedT> class ComposableParserImpl : public ParserBase {
            public:
                template <typename T> auto operator|(T const& other) const -> Parser;

                template <typename T> auto operator+(T const& other) const -> Parser;
            };

            // Common code and state for Args and Opts
            template <typename DerivedT>
            class ParserRefImpl : public ComposableParserImpl<DerivedT> {
            protected:
                Optionality m_optionality = Optionality::Optional;
                std::shared_ptr<BoundRef> m_ref;
                std::string m_hint;
                std::string m_description;

                explicit ParserRefImpl(std::shared_ptr<BoundRef> const& ref) : m_ref(ref) {}

            public:
                template <typename T>
                ParserRefImpl(T& ref, std::string const& hint) :
                    m_ref(std::make_shared<BoundValueRef<T>>(ref)), m_hint(hint) {}

                template <typename LambdaT>
                ParserRefImpl(LambdaT const& ref, std::string const& hint) :
                    m_ref(std::make_shared<BoundLambda<LambdaT>>(ref)), m_hint(hint) {}

                auto operator()(std::string const& description) -> DerivedT& {
                    m_description = description;
                    return static_cast<DerivedT&>(*this);
                }

                auto optional() -> DerivedT& {
                    m_optionality = Optionality::Optional;
                    return static_cast<DerivedT&>(*this);
                };

                auto required() -> DerivedT& {
                    m_optionality = Optionality::Required;
                    return static_cast<DerivedT&>(*this);
                };

                auto isOptional() const -> bool { return m_optionality == Optionality::Optional; }

                auto cardinality() const -> size_t override {
                    if (m_ref->isContainer())
                        return 0;
                    else
                        return 1;
                }

                auto hint() const -> std::string { return m_hint; }
            };

            class ExeName : public ComposableParserImpl<ExeName> {
                std::shared_ptr<std::string> m_name;
                std::shared_ptr<BoundValueRefBase> m_ref;

                template <typename LambdaT>
                static auto makeRef(LambdaT const& lambda) -> std::shared_ptr<BoundValueRefBase> {
                    return std::make_shared<BoundLambda<LambdaT>>(lambda);
                }

            public:
                ExeName() : m_name(std::make_shared<std::string>("<executable>")) {}

                explicit ExeName(std::string& ref) : ExeName() {
                    m_ref = std::make_shared<BoundValueRef<std::string>>(ref);
                }

                template <typename LambdaT> explicit ExeName(LambdaT const& lambda) : ExeName() {
                    m_ref = std::make_shared<BoundLambda<LambdaT>>(lambda);
                }

                // The exe name is not parsed out of the normal tokens, but is
                // handled specially
                auto parse(std::string const&, TokenStream const& tokens) const
                    -> InternalParseResult override {
                    return InternalParseResult::ok(ParseState(ParseResultType::NoMatch, tokens));
                }

                auto name() const -> std::string { return *m_name; }
                auto set(std::string const& newName) -> ParserResult {

                    auto lastSlash = newName.find_last_of("\\/");
                    auto filename =
                        (lastSlash == std::string::npos) ? newName : newName.substr(lastSlash + 1);

                    *m_name = filename;
                    if (m_ref)
                        return m_ref->setValue(filename);
                    else
                        return ParserResult::ok(ParseResultType::Matched);
                }
            };

            class Arg : public ParserRefImpl<Arg> {
            public:
                using ParserRefImpl::ParserRefImpl;

                auto parse(std::string const&, TokenStream const& tokens) const
                    -> InternalParseResult override {
                    auto validationResult = validate();
                    if (!validationResult)
                        return InternalParseResult(validationResult);

                    auto remainingTokens = tokens;
                    auto const& token = *remainingTokens;
                    if (token.type != TokenType::Argument)
                        return InternalParseResult::ok(
                            ParseState(ParseResultType::NoMatch, remainingTokens));

                    assert(!m_ref->isFlag());
                    auto valueRef = static_cast<detail::BoundValueRefBase*>(m_ref.get());

                    auto result = valueRef->setValue(remainingTokens->token);
                    if (!result)
                        return InternalParseResult(result);
                    else
                        return InternalParseResult::ok(
                            ParseState(ParseResultType::Matched, ++remainingTokens));
                }
            };

            inline auto normaliseOpt(std::string const& optName) -> std::string {
#ifdef CATCH_PLATFORM_WINDOWS
                if (optName[0] == '/')
                    return "-" + optName.substr(1);
                else
#endif
                    return optName;
            }

            class Opt : public ParserRefImpl<Opt> {
            protected:
                std::vector<std::string> m_optNames;

            public:
                template <typename LambdaT>
                explicit Opt(LambdaT const& ref) :
                    ParserRefImpl(std::make_shared<BoundFlagLambda<LambdaT>>(ref)) {}

                explicit Opt(bool& ref) : ParserRefImpl(std::make_shared<BoundFlagRef>(ref)) {}

                template <typename LambdaT>
                Opt(LambdaT const& ref, std::string const& hint) : ParserRefImpl(ref, hint) {}

                template <typename T>
                Opt(T& ref, std::string const& hint) : ParserRefImpl(ref, hint) {}

                auto operator[](std::string const& optName) -> Opt& {
                    m_optNames.push_back(optName);
                    return *this;
                }

                auto getHelpColumns() const -> std::vector<HelpColumns> {
                    std::ostringstream oss;
                    bool first = true;
                    for (auto const& opt : m_optNames) {
                        if (first)
                            first = false;
                        else
                            oss << ", ";
                        oss << opt;
                    }
                    if (!m_hint.empty())
                        oss << " <" << m_hint << ">";
                    return {{oss.str(), m_description}};
                }

                auto isMatch(std::string const& optToken) const -> bool {
                    auto normalisedToken = normaliseOpt(optToken);
                    for (auto const& name : m_optNames) {
                        if (normaliseOpt(name) == normalisedToken)
                            return true;
                    }
                    return false;
                }

                using ParserBase::parse;

                auto parse(std::string const&, TokenStream const& tokens) const
                    -> InternalParseResult override {
                    auto validationResult = validate();
                    if (!validationResult)
                        return InternalParseResult(validationResult);

                    auto remainingTokens = tokens;
                    if (remainingTokens && remainingTokens->type == TokenType::Option) {
                        auto const& token = *remainingTokens;
                        if (isMatch(token.token)) {
                            if (m_ref->isFlag()) {
                                auto flagRef = static_cast<detail::BoundFlagRefBase*>(m_ref.get());
                                auto result = flagRef->setFlag(true);
                                if (!result)
                                    return InternalParseResult(result);
                                if (result.value() == ParseResultType::ShortCircuitAll)
                                    return InternalParseResult::ok(
                                        ParseState(result.value(), remainingTokens));
                            } else {
                                auto valueRef =
                                    static_cast<detail::BoundValueRefBase*>(m_ref.get());
                                ++remainingTokens;
                                if (!remainingTokens)
                                    return InternalParseResult::runtimeError(
                                        "Expected argument following " + token.token);
                                auto const& argToken = *remainingTokens;
                                if (argToken.type != TokenType::Argument)
                                    return InternalParseResult::runtimeError(
                                        "Expected argument following " + token.token);
                                auto result = valueRef->setValue(argToken.token);
                                if (!result)
                                    return InternalParseResult(result);
                                if (result.value() == ParseResultType::ShortCircuitAll)
                                    return InternalParseResult::ok(
                                        ParseState(result.value(), remainingTokens));
                            }
                            return InternalParseResult::ok(
                                ParseState(ParseResultType::Matched, ++remainingTokens));
                        }
                    }
                    return InternalParseResult::ok(
                        ParseState(ParseResultType::NoMatch, remainingTokens));
                }

                auto validate() const -> Result override {
                    if (m_optNames.empty())
                        return Result::logicError("No options supplied to Opt");
                    for (auto const& name : m_optNames) {
                        if (name.empty())
                            return Result::logicError("Option name cannot be empty");
#ifdef CATCH_PLATFORM_WINDOWS
                        if (name[0] != '-' && name[0] != '/')
                            return Result::logicError("Option name must begin with '-' or '/'");
#else
                        if (name[0] != '-')
                            return Result::logicError("Option name must begin with '-'");
#endif
                    }
                    return ParserRefImpl::validate();
                }
            };

            struct Help : Opt {
                Help(bool& showHelpFlag) :
                    Opt([&](bool flag) {
                        showHelpFlag = flag;
                        return ParserResult::ok(ParseResultType::ShortCircuitAll);
                    }) {
                    static_cast<Opt&> (*this)("display usage information")["-?"]["-h"]["--help"]
                        .optional();
                }
            };

            struct Parser : ParserBase {

                mutable ExeName m_exeName;
                std::vector<Opt> m_options;
                std::vector<Arg> m_args;

                auto operator|=(ExeName const& exeName) -> Parser& {
                    m_exeName = exeName;
                    return *this;
                }

                auto operator|=(Arg const& arg) -> Parser& {
                    m_args.push_back(arg);
                    return *this;
                }

                auto operator|=(Opt const& opt) -> Parser& {
                    m_options.push_back(opt);
                    return *this;
                }

                auto operator|=(Parser const& other) -> Parser& {
                    m_options.insert(
                        m_options.end(), other.m_options.begin(), other.m_options.end());
                    m_args.insert(m_args.end(), other.m_args.begin(), other.m_args.end());
                    return *this;
                }

                template <typename T> auto operator|(T const& other) const -> Parser {
                    return Parser(*this) |= other;
                }

                // Forward deprecated interface with '+' instead of '|'
                template <typename T> auto operator+=(T const& other) -> Parser& {
                    return operator|=(other);
                }
                template <typename T> auto operator+(T const& other) const -> Parser {
                    return operator|(other);
                }

                auto getHelpColumns() const -> std::vector<HelpColumns> {
                    std::vector<HelpColumns> cols;
                    for (auto const& o : m_options) {
                        auto childCols = o.getHelpColumns();
                        cols.insert(cols.end(), childCols.begin(), childCols.end());
                    }
                    return cols;
                }

                void writeToStream(std::ostream& os) const {
                    if (!m_exeName.name().empty()) {
                        os << "usage:\n"
                           << "  " << m_exeName.name() << " ";
                        bool required = true, first = true;
                        for (auto const& arg : m_args) {
                            if (first)
                                first = false;
                            else
                                os << " ";
                            if (arg.isOptional() && required) {
                                os << "[";
                                required = false;
                            }
                            os << "<" << arg.hint() << ">";
                            if (arg.cardinality() == 0)
                                os << " ... ";
                        }
                        if (!required)
                            os << "]";
                        if (!m_options.empty())
                            os << " options";
                        os << "\n\nwhere options are:" << std::endl;
                    }

                    auto rows = getHelpColumns();
                    size_t consoleWidth = CATCH_CLARA_CONFIG_CONSOLE_WIDTH;
                    size_t optWidth = 0;
                    for (auto const& cols : rows)
                        optWidth = (std::max)(optWidth, cols.left.size() + 2);

                    optWidth = (std::min)(optWidth, consoleWidth / 2);

                    for (auto const& cols : rows) {
                        auto row = TextFlow::Column(cols.left).width(optWidth).indent(2) +
                                   TextFlow::Spacer(4) +
                                   TextFlow::Column(cols.right).width(consoleWidth - 7 - optWidth);
                        os << row << std::endl;
                    }
                }

                friend auto operator<<(std::ostream& os, Parser const& parser) -> std::ostream& {
                    parser.writeToStream(os);
                    return os;
                }

                auto validate() const -> Result override {
                    for (auto const& opt : m_options) {
                        auto result = opt.validate();
                        if (!result)
                            return result;
                    }
                    for (auto const& arg : m_args) {
                        auto result = arg.validate();
                        if (!result)
                            return result;
                    }
                    return Result::ok();
                }

                using ParserBase::parse;

                auto parse(std::string const& exeName, TokenStream const& tokens) const
                    -> InternalParseResult override {

                    struct ParserInfo {
                        ParserBase const* parser = nullptr;
                        size_t count = 0;
                    };
                    const size_t totalParsers = m_options.size() + m_args.size();
                    assert(totalParsers < 512);
                    // ParserInfo parseInfos[totalParsers]; // <-- this is what
                    // we really want to do
                    ParserInfo parseInfos[512];

                    {
                        size_t i = 0;
                        for (auto const& opt : m_options)
                            parseInfos[i++].parser = &opt;
                        for (auto const& arg : m_args)
                            parseInfos[i++].parser = &arg;
                    }

                    m_exeName.set(exeName);

                    auto result =
                        InternalParseResult::ok(ParseState(ParseResultType::NoMatch, tokens));
                    while (result.value().remainingTokens()) {
                        bool tokenParsed = false;

                        for (size_t i = 0; i < totalParsers; ++i) {
                            auto& parseInfo = parseInfos[i];
                            if (parseInfo.parser->cardinality() == 0 ||
                                parseInfo.count < parseInfo.parser->cardinality()) {
                                result = parseInfo.parser->parse(exeName,
                                                                 result.value().remainingTokens());
                                if (!result)
                                    return result;
                                if (result.value().type() != ParseResultType::NoMatch) {
                                    tokenParsed = true;
                                    ++parseInfo.count;
                                    break;
                                }
                            }
                        }

                        if (result.value().type() == ParseResultType::ShortCircuitAll)
                            return result;
                        if (!tokenParsed)
                            return InternalParseResult::runtimeError(
                                "Unrecognised token: " + result.value().remainingTokens()->token);
                    }
                    // !TBD Check missing required options
                    return result;
                }
            };

            template <typename DerivedT>
            template <typename T>
            auto ComposableParserImpl<DerivedT>::operator|(T const& other) const -> Parser {
                return Parser() | static_cast<DerivedT const&>(*this) | other;
            }
        } // namespace detail

        // A Combined parser
        using detail::Parser;

        // A parser for options
        using detail::Opt;

        // A parser for arguments
        using detail::Arg;

        // Wrapper for argc, argv from main()
        using detail::Args;

        // Specifies the name of the executable
        using detail::ExeName;

        // Convenience wrapper for option parser that specifies the help option
        using detail::Help;

        // enum of result types from a parse
        using detail::ParseResultType;

        // Result type for parser operation
        using detail::ParserResult;

    } // namespace clara
} // namespace Catch

// end clara.hpp
#ifdef __clang__
#pragma clang diagnostic pop
#endif

// Restore Clara's value for console width, if present
#ifdef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH
#define CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH
#undef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH
#endif

// end catch_clara.h
namespace Catch {

    clara::Parser makeCommandLineParser(ConfigData& config);

} // end namespace Catch

// end catch_commandline.h
#include <fstream>
#include <ctime>

namespace Catch {

    clara::Parser makeCommandLineParser(ConfigData& config) {

        using namespace clara;

        auto const setWarning = [&](std::string const& warning) {
            auto warningSet = [&]() {
                if (warning == "NoAssertions")
                    return WarnAbout::NoAssertions;

                if (warning == "NoTests")
                    return WarnAbout::NoTests;

                return WarnAbout::Nothing;
            }();

            if (warningSet == WarnAbout::Nothing)
                return ParserResult::runtimeError("Unrecognised warning: '" + warning + "'");
            config.warnings = static_cast<WarnAbout::What>(config.warnings | warningSet);
            return ParserResult::ok(ParseResultType::Matched);
        };
        auto const loadTestNamesFromFile = [&](std::string const& filename) {
            std::ifstream f(filename.c_str());
            if (!f.is_open())
                return ParserResult::runtimeError("Unable to load input file: '" + filename + "'");

            std::string line;
            while (std::getline(f, line)) {
                line = trim(line);
                if (!line.empty() && !startsWith(line, '#')) {
                    if (!startsWith(line, '"'))
                        line = '"' + line + '"';
                    config.testsOrTags.push_back(line);
                    config.testsOrTags.emplace_back(",");
                }
            }
            // Remove comma in the end
            if (!config.testsOrTags.empty())
                config.testsOrTags.erase(config.testsOrTags.end() - 1);

            return ParserResult::ok(ParseResultType::Matched);
        };
        auto const setTestOrder = [&](std::string const& order) {
            if (startsWith("declared", order))
                config.runOrder = RunTests::InDeclarationOrder;
            else if (startsWith("lexical", order))
                config.runOrder = RunTests::InLexicographicalOrder;
            else if (startsWith("random", order))
                config.runOrder = RunTests::InRandomOrder;
            else
                return clara::ParserResult::runtimeError("Unrecognised ordering: '" + order + "'");
            return ParserResult::ok(ParseResultType::Matched);
        };
        auto const setRngSeed = [&](std::string const& seed) {
            if (seed != "time")
                return clara::detail::convertInto(seed, config.rngSeed);
            config.rngSeed = static_cast<unsigned int>(std::time(nullptr));
            return ParserResult::ok(ParseResultType::Matched);
        };
        auto const setColourUsage = [&](std::string const& useColour) {
            auto mode = toLower(useColour);

            if (mode == "yes")
                config.useColour = UseColour::Yes;
            else if (mode == "no")
                config.useColour = UseColour::No;
            else if (mode == "auto")
                config.useColour = UseColour::Auto;
            else
                return ParserResult::runtimeError("colour mode must be one of: auto, yes or no. '" +
                                                  useColour + "' not recognised");
            return ParserResult::ok(ParseResultType::Matched);
        };
        auto const setWaitForKeypress = [&](std::string const& keypress) {
            auto keypressLc = toLower(keypress);
            if (keypressLc == "never")
                config.waitForKeypress = WaitForKeypress::Never;
            else if (keypressLc == "start")
                config.waitForKeypress = WaitForKeypress::BeforeStart;
            else if (keypressLc == "exit")
                config.waitForKeypress = WaitForKeypress::BeforeExit;
            else if (keypressLc == "both")
                config.waitForKeypress = WaitForKeypress::BeforeStartAndExit;
            else
                return ParserResult::runtimeError(
                    "keypress argument must be one of: never, start, exit or "
                    "both. '" +
                    keypress + "' not recognised");
            return ParserResult::ok(ParseResultType::Matched);
        };
        auto const setVerbosity = [&](std::string const& verbosity) {
            auto lcVerbosity = toLower(verbosity);
            if (lcVerbosity == "quiet")
                config.verbosity = Verbosity::Quiet;
            else if (lcVerbosity == "normal")
                config.verbosity = Verbosity::Normal;
            else if (lcVerbosity == "high")
                config.verbosity = Verbosity::High;
            else
                return ParserResult::runtimeError("Unrecognised verbosity, '" + verbosity + "'");
            return ParserResult::ok(ParseResultType::Matched);
        };
        auto const setReporter = [&](std::string const& reporter) {
            IReporterRegistry::FactoryMap const& factories =
                getRegistryHub().getReporterRegistry().getFactories();

            auto lcReporter = toLower(reporter);
            auto result = factories.find(lcReporter);

            if (factories.end() != result)
                config.reporterName = lcReporter;
            else
                return ParserResult::runtimeError("Unrecognized reporter, '" + reporter +
                                                  "'. Check available with --list-reporters");
            return ParserResult::ok(ParseResultType::Matched);
        };

        auto cli =
            ExeName(config.processName) | Help(config.showHelp) |
            Opt(config.listTests)["-l"]["--list-tests"]("list all/matching test cases") |
            Opt(config.listTags)["-t"]["--list-tags"]("list all/matching tags") |
            Opt(config.showSuccessfulTests)["-s"]["--success"](
                "include successful tests in output") |
            Opt(config.shouldDebugBreak)["-b"]["--break"]("break into debugger on failure") |
            Opt(config.noThrow)["-e"]["--nothrow"]("skip exception tests") |
            Opt(config.showInvisibles)["-i"]["--invisibles"]("show invisibles (tabs, newlines)") |
            Opt(config.outputFilename, "filename")["-o"]["--out"]("output filename") |
            Opt(setReporter, "name")["-r"]["--reporter"]("reporter to use (defaults to console)") |
            Opt(config.name, "name")["-n"]["--name"]("suite name") |
            Opt([&](bool) { config.abortAfter = 1; })["-a"]["--abort"]("abort at first failure") |
            Opt([&](int x) { config.abortAfter = x; },
                "no. failures")["-x"]["--abortx"]("abort after x failures") |
            Opt(setWarning, "warning name")["-w"]["--warn"]("enable warnings") |
            Opt(
                [&](bool flag) {
                    config.showDurations = flag ? ShowDurations::Always : ShowDurations::Never;
                },
                "yes|no")["-d"]["--durations"]("show test durations") |
            Opt(config.minDuration, "seconds")["-D"]["--min-duration"](
                "show test durations for tests taking at least the given "
                "number of seconds") |
            Opt(loadTestNamesFromFile,
                "filename")["-f"]["--input-file"]("load test names to run from a file") |
            Opt(config.filenamesAsTags)["-#"]["--filenames-as-tags"](
                "adds a tag for the filename") |
            Opt(config.sectionsToRun, "section name")["-c"]["--section"]("specify section to run") |
            Opt(setVerbosity, "quiet|normal|high")["-v"]["--verbosity"]("set output verbosity") |
            Opt(config.listTestNamesOnly)["--list-test-names-only"](
                "list all/matching test cases names only") |
            Opt(config.listReporters)["--list-reporters"]("list all reporters") |
            Opt(setTestOrder, "decl|lex|rand")["--order"]("test case order (defaults to decl)") |
            Opt(setRngSeed,
                "'time'|number")["--rng-seed"]("set a specific seed for random numbers") |
            Opt(setColourUsage, "yes|no")["--use-colour"]("should output be colourised") |
            Opt(config.libIdentify)["--libidentify"](
                "report name and version according to libidentify standard") |
            Opt(setWaitForKeypress, "never|start|exit|both")["--wait-for-keypress"](
                "waits for a keypress before exiting") |
            Opt(config.benchmarkSamples,
                "samples")["--benchmark-samples"]("number of samples to collect (default: 100)") |
            Opt(config.benchmarkResamples, "resamples")["--benchmark-resamples"](
                "number of resamples for the bootstrap (default: 100000)") |
            Opt(config.benchmarkConfidenceInterval,
                "confidence interval")["--benchmark-confidence-interval"](
                "confidence interval for the bootstrap (between 0 and 1, "
                "default: 0.95)") |
            Opt(config.benchmarkNoAnalysis)["--benchmark-no-analysis"](
                "perform only measurements; do not perform any analysis") |
            Opt(config.benchmarkWarmupTime, "benchmarkWarmupTime")["--benchmark-warmup-time"](
                "amount of time in milliseconds spent on warming up each test "
                "(default: 100)") |
            Arg(config.testsOrTags, "test name|pattern|tags")("which test or tests to use");

        return cli;
    }

} // end namespace Catch
// end catch_commandline.cpp
// start catch_common.cpp

#include <cstring>
#include <ostream>

namespace Catch {

    bool SourceLineInfo::operator==(SourceLineInfo const& other) const noexcept {
        return line == other.line && (file == other.file || std::strcmp(file, other.file) == 0);
    }
    bool SourceLineInfo::operator<(SourceLineInfo const& other) const noexcept {
        // We can assume that the same file will usually have the same pointer.
        // Thus, if the pointers are the same, there is no point in calling the
        // strcmp
        return line < other.line ||
               (line == other.line && file != other.file && (std::strcmp(file, other.file) < 0));
    }

    std::ostream& operator<<(std::ostream& os, SourceLineInfo const& info) {
#ifndef __GNUG__
        os << info.file << '(' << info.line << ')';
#else
        os << info.file << ':' << info.line;
#endif
        return os;
    }

    std::string StreamEndStop::operator+() const { return std::string(); }

    NonCopyable::NonCopyable() = default;
    NonCopyable::~NonCopyable() = default;

} // namespace Catch
// end catch_common.cpp
// start catch_config.cpp

namespace Catch {

    Config::Config(ConfigData const& data) : m_data(data), m_stream(openStream()) {
        // We need to trim filter specs to avoid trouble with superfluous
        // whitespace (esp. important for bdd macros, as those are manually
        // aligned with whitespace).

        for (auto& elem : m_data.testsOrTags) {
            elem = trim(elem);
        }
        for (auto& elem : m_data.sectionsToRun) {
            elem = trim(elem);
        }

        TestSpecParser parser(ITagAliasRegistry::get());
        if (!m_data.testsOrTags.empty()) {
            m_hasTestFilters = true;
            for (auto const& testOrTags : m_data.testsOrTags) {
                parser.parse(testOrTags);
            }
        }
        m_testSpec = parser.testSpec();
    }

    std::string const& Config::getFilename() const { return m_data.outputFilename; }

    bool Config::listTests() const { return m_data.listTests; }
    bool Config::listTestNamesOnly() const { return m_data.listTestNamesOnly; }
    bool Config::listTags() const { return m_data.listTags; }
    bool Config::listReporters() const { return m_data.listReporters; }

    std::string Config::getProcessName() const { return m_data.processName; }
    std::string const& Config::getReporterName() const { return m_data.reporterName; }

    std::vector<std::string> const& Config::getTestsOrTags() const { return m_data.testsOrTags; }
    std::vector<std::string> const& Config::getSectionsToRun() const {
        return m_data.sectionsToRun;
    }

    TestSpec const& Config::testSpec() const { return m_testSpec; }
    bool Config::hasTestFilters() const { return m_hasTestFilters; }

    bool Config::showHelp() const { return m_data.showHelp; }

    // IConfig interface
    bool Config::allowThrows() const { return !m_data.noThrow; }
    std::ostream& Config::stream() const { return m_stream->stream(); }
    std::string Config::name() const {
        return m_data.name.empty() ? m_data.processName : m_data.name;
    }
    bool Config::includeSuccessfulResults() const { return m_data.showSuccessfulTests; }
    bool Config::warnAboutMissingAssertions() const {
        return !!(m_data.warnings & WarnAbout::NoAssertions);
    }
    bool Config::warnAboutNoTests() const { return !!(m_data.warnings & WarnAbout::NoTests); }
    ShowDurations::OrNot Config::showDurations() const { return m_data.showDurations; }
    double Config::minDuration() const { return m_data.minDuration; }
    RunTests::InWhatOrder Config::runOrder() const { return m_data.runOrder; }
    unsigned int Config::rngSeed() const { return m_data.rngSeed; }
    UseColour::YesOrNo Config::useColour() const { return m_data.useColour; }
    bool Config::shouldDebugBreak() const { return m_data.shouldDebugBreak; }
    int Config::abortAfter() const { return m_data.abortAfter; }
    bool Config::showInvisibles() const { return m_data.showInvisibles; }
    Verbosity Config::verbosity() const { return m_data.verbosity; }

    bool Config::benchmarkNoAnalysis() const { return m_data.benchmarkNoAnalysis; }
    int Config::benchmarkSamples() const { return m_data.benchmarkSamples; }
    double Config::benchmarkConfidenceInterval() const {
        return m_data.benchmarkConfidenceInterval;
    }
    unsigned int Config::benchmarkResamples() const { return m_data.benchmarkResamples; }
    std::chrono::milliseconds Config::benchmarkWarmupTime() const {
        return std::chrono::milliseconds(m_data.benchmarkWarmupTime);
    }

    IStream const* Config::openStream() { return Catch::makeStream(m_data.outputFilename); }

} // end namespace Catch
// end catch_config.cpp
// start catch_console_colour.cpp

#if defined(__clang__)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wexit-time-destructors"
#endif

// start catch_errno_guard.h

namespace Catch {

    class ErrnoGuard {
    public:
        ErrnoGuard();
        ~ErrnoGuard();

    private:
        int m_oldErrno;
    };

} // namespace Catch

// end catch_errno_guard.h
// start catch_windows_h_proxy.h

#if defined(CATCH_PLATFORM_WINDOWS)

#if !defined(NOMINMAX) && !defined(CATCH_CONFIG_NO_NOMINMAX)
#define CATCH_DEFINED_NOMINMAX
#define NOMINMAX
#endif
#if !defined(WIN32_LEAN_AND_MEAN) && !defined(CATCH_CONFIG_NO_WIN32_LEAN_AND_MEAN)
#define CATCH_DEFINED_WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#ifdef __AFXDLL
#include <AfxWin.h>
#else
#include <windows.h>
#endif

#ifdef CATCH_DEFINED_NOMINMAX
#undef NOMINMAX
#endif
#ifdef CATCH_DEFINED_WIN32_LEAN_AND_MEAN
#undef WIN32_LEAN_AND_MEAN
#endif

#endif // defined(CATCH_PLATFORM_WINDOWS)

// end catch_windows_h_proxy.h
#include <sstream>

namespace Catch {
    namespace {

        struct IColourImpl {
            virtual ~IColourImpl() = default;
            virtual void use(Colour::Code _colourCode) = 0;
        };

        struct NoColourImpl : IColourImpl {
            void use(Colour::Code) override {}

            static IColourImpl* instance() {
                static NoColourImpl s_instance;
                return &s_instance;
            }
        };

    } // namespace
} // namespace Catch

#if !defined(CATCH_CONFIG_COLOUR_NONE) && !defined(CATCH_CONFIG_COLOUR_WINDOWS) &&                 \
    !defined(CATCH_CONFIG_COLOUR_ANSI)
#ifdef CATCH_PLATFORM_WINDOWS
#define CATCH_CONFIG_COLOUR_WINDOWS
#else
#define CATCH_CONFIG_COLOUR_ANSI
#endif
#endif

#if defined(CATCH_CONFIG_COLOUR_WINDOWS) /////////////////////////////////////////

namespace Catch {
    namespace {

        class Win32ColourImpl : public IColourImpl {
        public:
            Win32ColourImpl() : stdoutHandle(GetStdHandle(STD_OUTPUT_HANDLE)) {
                CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
                GetConsoleScreenBufferInfo(stdoutHandle, &csbiInfo);
                originalForegroundAttributes =
                    csbiInfo.wAttributes &
                    ~(BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_BLUE | BACKGROUND_INTENSITY);
                originalBackgroundAttributes =
                    csbiInfo.wAttributes &
                    ~(FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
            }

            void use(Colour::Code _colourCode) override {
                switch (_colourCode) {
                    case Colour::None:
                        return setTextAttribute(originalForegroundAttributes);
                    case Colour::White:
                        return setTextAttribute(FOREGROUND_GREEN | FOREGROUND_RED |
                                                FOREGROUND_BLUE);
                    case Colour::Red:
                        return setTextAttribute(FOREGROUND_RED);
                    case Colour::Green:
                        return setTextAttribute(FOREGROUND_GREEN);
                    case Colour::Blue:
                        return setTextAttribute(FOREGROUND_BLUE);
                    case Colour::Cyan:
                        return setTextAttribute(FOREGROUND_BLUE | FOREGROUND_GREEN);
                    case Colour::Yellow:
                        return setTextAttribute(FOREGROUND_RED | FOREGROUND_GREEN);
                    case Colour::Grey:
                        return setTextAttribute(0);

                    case Colour::LightGrey:
                        return setTextAttribute(FOREGROUND_INTENSITY);
                    case Colour::BrightRed:
                        return setTextAttribute(FOREGROUND_INTENSITY | FOREGROUND_RED);
                    case Colour::BrightGreen:
                        return setTextAttribute(FOREGROUND_INTENSITY | FOREGROUND_GREEN);
                    case Colour::BrightWhite:
                        return setTextAttribute(FOREGROUND_INTENSITY | FOREGROUND_GREEN |
                                                FOREGROUND_RED | FOREGROUND_BLUE);
                    case Colour::BrightYellow:
                        return setTextAttribute(FOREGROUND_INTENSITY | FOREGROUND_RED |
                                                FOREGROUND_GREEN);

                    case Colour::Bright:
                        CATCH_INTERNAL_ERROR("not a colour");

                    default:
                        CATCH_ERROR("Unknown colour requested");
                }
            }

        private:
            void setTextAttribute(WORD _textAttribute) {
                SetConsoleTextAttribute(stdoutHandle,
                                        _textAttribute | originalBackgroundAttributes);
            }
            HANDLE stdoutHandle;
            WORD originalForegroundAttributes;
            WORD originalBackgroundAttributes;
        };

        IColourImpl* platformColourInstance() {
            static Win32ColourImpl s_instance;

            IConfigPtr config = getCurrentContext().getConfig();
            UseColour::YesOrNo colourMode = config ? config->useColour() : UseColour::Auto;
            if (colourMode == UseColour::Auto)
                colourMode = UseColour::Yes;
            return colourMode == UseColour::Yes ? &s_instance : NoColourImpl::instance();
        }

    } // namespace
} // end namespace Catch

#elif defined(CATCH_CONFIG_COLOUR_ANSI) //////////////////////////////////////

#include <unistd.h>

namespace Catch {
    namespace {

        // use POSIX/ ANSI console terminal codes
        // Thanks to Adam Strzelecki for original contribution
        // (http://github.com/nanoant)
        // https://github.com/philsquared/Catch/pull/131
        class PosixColourImpl : public IColourImpl {
        public:
            void use(Colour::Code _colourCode) override {
                switch (_colourCode) {
                    case Colour::None:
                    case Colour::White:
                        return setColour("[0m");
                    case Colour::Red:
                        return setColour("[0;31m");
                    case Colour::Green:
                        return setColour("[0;32m");
                    case Colour::Blue:
                        return setColour("[0;34m");
                    case Colour::Cyan:
                        return setColour("[0;36m");
                    case Colour::Yellow:
                        return setColour("[0;33m");
                    case Colour::Grey:
                        return setColour("[1;30m");

                    case Colour::LightGrey:
                        return setColour("[0;37m");
                    case Colour::BrightRed:
                        return setColour("[1;31m");
                    case Colour::BrightGreen:
                        return setColour("[1;32m");
                    case Colour::BrightWhite:
                        return setColour("[1;37m");
                    case Colour::BrightYellow:
                        return setColour("[1;33m");

                    case Colour::Bright:
                        CATCH_INTERNAL_ERROR("not a colour");
                    default:
                        CATCH_INTERNAL_ERROR("Unknown colour requested");
                }
            }
            static IColourImpl* instance() {
                static PosixColourImpl s_instance;
                return &s_instance;
            }

        private:
            void setColour(const char* _escapeCode) {
                getCurrentContext().getConfig()->stream() << '\033' << _escapeCode;
            }
        };

        bool useColourOnPlatform() {
            return
#if defined(CATCH_PLATFORM_MAC) || defined(CATCH_PLATFORM_IPHONE)
                !isDebuggerActive() &&
#endif
#if !(defined(__DJGPP__) && defined(__STRICT_ANSI__))
                isatty(STDOUT_FILENO)
#else
                false
#endif
                    ;
        }
        IColourImpl* platformColourInstance() {
            ErrnoGuard guard;
            IConfigPtr config = getCurrentContext().getConfig();
            UseColour::YesOrNo colourMode = config ? config->useColour() : UseColour::Auto;
            if (colourMode == UseColour::Auto)
                colourMode = useColourOnPlatform() ? UseColour::Yes : UseColour::No;
            return colourMode == UseColour::Yes ? PosixColourImpl::instance()
                                                : NoColourImpl::instance();
        }

    } // namespace
} // end namespace Catch

#else // not Windows or ANSI ///////////////////////////////////////////////

namespace Catch {

    static IColourImpl* platformColourInstance() { return NoColourImpl::instance(); }

} // end namespace Catch

#endif // Windows/ ANSI/ None

namespace Catch {

    Colour::Colour(Code _colourCode) { use(_colourCode); }
    Colour::Colour(Colour&& other) noexcept {
        m_moved = other.m_moved;
        other.m_moved = true;
    }
    Colour& Colour::operator=(Colour&& other) noexcept {
        m_moved = other.m_moved;
        other.m_moved = true;
        return *this;
    }

    Colour::~Colour() {
        if (!m_moved)
            use(None);
    }

    void Colour::use(Code _colourCode) {
        static IColourImpl* impl = platformColourInstance();
        // Strictly speaking, this cannot possibly happen.
        // However, under some conditions it does happen (see #1626),
        // and this change is small enough that we can let practicality
        // triumph over purity in this case.
        if (impl != nullptr) {
            impl->use(_colourCode);
        }
    }

    std::ostream& operator<<(std::ostream& os, Colour const&) { return os; }

} // end namespace Catch

#if defined(__clang__)
#pragma clang diagnostic pop
#endif

// end catch_console_colour.cpp
// start catch_context.cpp

namespace Catch {

    class Context : public IMutableContext, NonCopyable {

    public: // IContext
        IResultCapture* getResultCapture() override { return m_resultCapture; }
        IRunner* getRunner() override { return m_runner; }

        IConfigPtr const& getConfig() const override { return m_config; }

        ~Context() override;

    public: // IMutableContext
        void setResultCapture(IResultCapture* resultCapture) override {
            m_resultCapture = resultCapture;
        }
        void setRunner(IRunner* runner) override { m_runner = runner; }
        void setConfig(IConfigPtr const& config) override { m_config = config; }

        friend IMutableContext& getCurrentMutableContext();

    private:
        IConfigPtr m_config;
        IRunner* m_runner = nullptr;
        IResultCapture* m_resultCapture = nullptr;
    };

    IMutableContext* IMutableContext::currentContext = nullptr;

    void IMutableContext::createContext() { currentContext = new Context(); }

    void cleanUpContext() {
        delete IMutableContext::currentContext;
        IMutableContext::currentContext = nullptr;
    }
    IContext::~IContext() = default;
    IMutableContext::~IMutableContext() = default;
    Context::~Context() = default;

    SimplePcg32& rng() {
        static SimplePcg32 s_rng;
        return s_rng;
    }

} // namespace Catch
// end catch_context.cpp
// start catch_debug_console.cpp

// start catch_debug_console.h

#include <string>

namespace Catch {
    void writeToDebugConsole(std::string const& text);
}

// end catch_debug_console.h
#if defined(CATCH_CONFIG_ANDROID_LOGWRITE)
#include <android/log.h>

namespace Catch {
    void writeToDebugConsole(std::string const& text) {
        __android_log_write(ANDROID_LOG_DEBUG, "Catch", text.c_str());
    }
} // namespace Catch

#elif defined(CATCH_PLATFORM_WINDOWS)

namespace Catch {
    void writeToDebugConsole(std::string const& text) { ::OutputDebugStringA(text.c_str()); }
} // namespace Catch

#else

namespace Catch {
    void writeToDebugConsole(std::string const& text) {
        // !TBD: Need a version for Mac/ XCode and other IDEs
        Catch::cout() << text;
    }
} // namespace Catch

#endif // Platform
// end catch_debug_console.cpp
// start catch_debugger.cpp

#if defined(CATCH_PLATFORM_MAC) || defined(CATCH_PLATFORM_IPHONE)

#include <cassert>
#include <sys/types.h>
#include <unistd.h>
#include <cstddef>
#include <ostream>

#ifdef __apple_build_version__
// These headers will only compile with AppleClang (XCode)
// For other compilers (Clang, GCC, ... ) we need to exclude them
#include <sys/sysctl.h>
#endif

namespace Catch {
#ifdef __apple_build_version__
    // The following function is taken directly from the following technical
    // note: https://developer.apple.com/library/archive/qa/qa1361/_index.html

    // Returns true if the current process is being debugged (either
    // running under the debugger or has a debugger attached post facto).
    bool isDebuggerActive() {
        int mib[4];
        struct kinfo_proc info;
        std::size_t size;

        // Initialize the flags so that, if sysctl fails for some bizarre
        // reason, we get a predictable result.

        info.kp_proc.p_flag = 0;

        // Initialize mib, which tells sysctl the info we want, in this case
        // we're looking for information about a specific process ID.

        mib[0] = CTL_KERN;
        mib[1] = KERN_PROC;
        mib[2] = KERN_PROC_PID;
        mib[3] = getpid();

        // Call sysctl.

        size = sizeof(info);
        if (sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, nullptr, 0) != 0) {
            Catch::cerr() << "\n** Call to sysctl failed - unable to determine "
                             "if debugger is active **\n"
                          << std::endl;
            return false;
        }

        // We're being debugged if the P_TRACED flag is set.

        return ((info.kp_proc.p_flag & P_TRACED) != 0);
    }
#else
    bool isDebuggerActive() {
        // We need to find another way to determine this for non-appleclang
        // compilers on macOS
        return false;
    }
#endif
} // namespace Catch

#elif defined(CATCH_PLATFORM_LINUX)
#include <fstream>
#include <string>

namespace Catch {
    // The standard POSIX way of detecting a debugger is to attempt to
    // ptrace() the process, but this needs to be done from a child and not
    // this process itself to still allow attaching to this process later
    // if wanted, so is rather heavy. Under Linux we have the PID of the
    // "debugger" (which doesn't need to be gdb, of course, it could also
    // be strace, for example) in /proc/$PID/status, so just get it from
    // there instead.
    bool isDebuggerActive() {
        // Libstdc++ has a bug, where std::ifstream sets errno to 0
        // This way our users can properly assert over errno values
        ErrnoGuard guard;
        std::ifstream in("/proc/self/status");
        for (std::string line; std::getline(in, line);) {
            static const int PREFIX_LEN = 11;
            if (line.compare(0, PREFIX_LEN, "TracerPid:\t") == 0) {
                // We're traced if the PID is not 0 and no other PID starts
                // with 0 digit, so it's enough to check for just a single
                // character.
                return line.length() > PREFIX_LEN && line[PREFIX_LEN] != '0';
            }
        }

        return false;
    }
} // namespace Catch
#elif defined(_MSC_VER)
extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent();
namespace Catch {
    bool isDebuggerActive() { return IsDebuggerPresent() != 0; }
} // namespace Catch
#elif defined(__MINGW32__)
extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent();
namespace Catch {
    bool isDebuggerActive() { return IsDebuggerPresent() != 0; }
} // namespace Catch
#else
namespace Catch {
    bool isDebuggerActive() { return false; }
} // namespace Catch
#endif // Platform
// end catch_debugger.cpp
// start catch_decomposer.cpp

namespace Catch {

    ITransientExpression::~ITransientExpression() = default;

    void formatReconstructedExpression(std::ostream& os,
                                       std::string const& lhs,
                                       StringRef op,
                                       std::string const& rhs) {
        if (lhs.size() + rhs.size() < 40 && lhs.find('\n') == std::string::npos &&
            rhs.find('\n') == std::string::npos)
            os << lhs << " " << op << " " << rhs;
        else
            os << lhs << "\n" << op << "\n" << rhs;
    }
} // namespace Catch
// end catch_decomposer.cpp
// start catch_enforce.cpp

#include <stdexcept>

namespace Catch {
#if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) &&                                                    \
    !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS_CUSTOM_HANDLER)
    [[noreturn]] void throw_exception(std::exception const& e) {
        Catch::cerr() << "Catch will terminate because it needed to throw an exception.\n"
                      << "The message was: " << e.what() << '\n';
        std::terminate();
    }
#endif

    [[noreturn]] void throw_logic_error(std::string const& msg) {
        throw_exception(std::logic_error(msg));
    }

    [[noreturn]] void throw_domain_error(std::string const& msg) {
        throw_exception(std::domain_error(msg));
    }

    [[noreturn]] void throw_runtime_error(std::string const& msg) {
        throw_exception(std::runtime_error(msg));
    }

} // namespace Catch
// end catch_enforce.cpp
// start catch_enum_values_registry.cpp
// start catch_enum_values_registry.h

#include <vector>
#include <memory>

namespace Catch {

    namespace Detail {

        std::unique_ptr<EnumInfo>
        makeEnumInfo(StringRef enumName, StringRef allValueNames, std::vector<int> const& values);

        class EnumValuesRegistry : public IMutableEnumValuesRegistry {

            std::vector<std::unique_ptr<EnumInfo>> m_enumInfos;

            EnumInfo const& registerEnum(StringRef enumName,
                                         StringRef allEnums,
                                         std::vector<int> const& values) override;
        };

        std::vector<StringRef> parseEnums(StringRef enums);

    } // namespace Detail

} // namespace Catch

// end catch_enum_values_registry.h

#include <map>
#include <cassert>

namespace Catch {

    IMutableEnumValuesRegistry::~IMutableEnumValuesRegistry() {}

    namespace Detail {

        namespace {
            // Extracts the actual name part of an enum instance
            // In other words, it returns the Blue part of
            // Bikeshed::Colour::Blue
            StringRef extractInstanceName(StringRef enumInstance) {
                // Find last occurrence of ":"
                size_t name_start = enumInstance.size();
                while (name_start > 0 && enumInstance[name_start - 1] != ':') {
                    --name_start;
                }
                return enumInstance.substr(name_start, enumInstance.size() - name_start);
            }
        } // namespace

        std::vector<StringRef> parseEnums(StringRef enums) {
            auto enumValues = splitStringRef(enums, ',');
            std::vector<StringRef> parsed;
            parsed.reserve(enumValues.size());
            for (auto const& enumValue : enumValues) {
                parsed.push_back(trim(extractInstanceName(enumValue)));
            }
            return parsed;
        }

        EnumInfo::~EnumInfo() {}

        StringRef EnumInfo::lookup(int value) const {
            for (auto const& valueToName : m_values) {
                if (valueToName.first == value)
                    return valueToName.second;
            }
            return "{** unexpected enum value **}"_sr;
        }

        std::unique_ptr<EnumInfo>
        makeEnumInfo(StringRef enumName, StringRef allValueNames, std::vector<int> const& values) {
            std::unique_ptr<EnumInfo> enumInfo(new EnumInfo);
            enumInfo->m_name = enumName;
            enumInfo->m_values.reserve(values.size());

            const auto valueNames = Catch::Detail::parseEnums(allValueNames);
            assert(valueNames.size() == values.size());
            std::size_t i = 0;
            for (auto value : values)
                enumInfo->m_values.emplace_back(value, valueNames[i++]);

            return enumInfo;
        }

        EnumInfo const& EnumValuesRegistry::registerEnum(StringRef enumName,
                                                         StringRef allValueNames,
                                                         std::vector<int> const& values) {
            m_enumInfos.push_back(makeEnumInfo(enumName, allValueNames, values));
            return *m_enumInfos.back();
        }

    } // namespace Detail
} // namespace Catch

// end catch_enum_values_registry.cpp
// start catch_errno_guard.cpp

#include <cerrno>

namespace Catch {
    ErrnoGuard::ErrnoGuard() : m_oldErrno(errno) {}
    ErrnoGuard::~ErrnoGuard() { errno = m_oldErrno; }
} // namespace Catch
// end catch_errno_guard.cpp
// start catch_exception_translator_registry.cpp

// start catch_exception_translator_registry.h

#include <vector>
#include <string>
#include <memory>

namespace Catch {

    class ExceptionTranslatorRegistry : public IExceptionTranslatorRegistry {
    public:
        ~ExceptionTranslatorRegistry();
        virtual void registerTranslator(const IExceptionTranslator* translator);
        std::string translateActiveException() const override;
        std::string tryTranslators() const;

    private:
        std::vector<std::unique_ptr<IExceptionTranslator const>> m_translators;
    };
} // namespace Catch

// end catch_exception_translator_registry.h
#ifdef __OBJC__
#import "Foundation/Foundation.h"
#endif

namespace Catch {

    ExceptionTranslatorRegistry::~ExceptionTranslatorRegistry() {}

    void ExceptionTranslatorRegistry::registerTranslator(const IExceptionTranslator* translator) {
        m_translators.push_back(std::unique_ptr<const IExceptionTranslator>(translator));
    }

#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
    std::string ExceptionTranslatorRegistry::translateActiveException() const {
        try {
#ifdef __OBJC__
            // In Objective-C try objective-c exceptions first
            @try
            {
                return tryTranslators();
            } @catch (NSException* exception)
            {
                return Catch::Detail::stringify([exception description]);
            }
#else
            // Compiling a mixed mode project with MSVC means that CLR
            // exceptions will be caught in (...) as well. However, these
            // do not fill-in std::current_exception and thus lead to crash
            // when attempting rethrow.
            // /EHa switch also causes structured exceptions to be caught
            // here, but they fill-in current_exception properly, so
            // at worst the output should be a little weird, instead of
            // causing a crash.
            if (std::current_exception() == nullptr) {
                return "Non C++ exception. Possibly a CLR exception.";
            }
            return tryTranslators();
#endif
        } catch (TestFailureException&) {
            std::rethrow_exception(std::current_exception());
        } catch (std::exception& ex) {
            return ex.what();
        } catch (std::string& msg) {
            return msg;
        } catch (const char* msg) {
            return msg;
        } catch (...) {
            return "Unknown exception";
        }
    }

    std::string ExceptionTranslatorRegistry::tryTranslators() const {
        if (m_translators.empty()) {
            std::rethrow_exception(std::current_exception());
        } else {
            return m_translators[0]->translate(m_translators.begin() + 1, m_translators.end());
        }
    }

#else // ^^ Exceptions are enabled // Exceptions are disabled vv
    std::string ExceptionTranslatorRegistry::translateActiveException() const {
        CATCH_INTERNAL_ERROR("Attempted to translate active exception under "
                             "CATCH_CONFIG_DISABLE_EXCEPTIONS!");
    }

    std::string ExceptionTranslatorRegistry::tryTranslators() const {
        CATCH_INTERNAL_ERROR("Attempted to use exception translators under "
                             "CATCH_CONFIG_DISABLE_EXCEPTIONS!");
    }
#endif

} // namespace Catch
// end catch_exception_translator_registry.cpp
// start catch_fatal_condition.cpp

#include <algorithm>

#if !defined(CATCH_CONFIG_WINDOWS_SEH) && !defined(CATCH_CONFIG_POSIX_SIGNALS)

namespace Catch {

    // If neither SEH nor signal handling is required, the handler impls
    // do not have to do anything, and can be empty.
    void FatalConditionHandler::engage_platform() {}
    void FatalConditionHandler::disengage_platform() {}
    FatalConditionHandler::FatalConditionHandler() = default;
    FatalConditionHandler::~FatalConditionHandler() = default;

} // end namespace Catch

#endif // !CATCH_CONFIG_WINDOWS_SEH && !CATCH_CONFIG_POSIX_SIGNALS

#if defined(CATCH_CONFIG_WINDOWS_SEH) && defined(CATCH_CONFIG_POSIX_SIGNALS)
#error                                                                                             \
    "Inconsistent configuration: Windows' SEH handling and POSIX signals cannot be enabled at the same time"
#endif // CATCH_CONFIG_WINDOWS_SEH && CATCH_CONFIG_POSIX_SIGNALS

#if defined(CATCH_CONFIG_WINDOWS_SEH) || defined(CATCH_CONFIG_POSIX_SIGNALS)

namespace {
    //! Signals fatal error message to the run context
    void reportFatal(char const* const message) {
        Catch::getCurrentContext().getResultCapture()->handleFatalErrorCondition(message);
    }

    //! Minimal size Catch2 needs for its own fatal error handling.
    //! Picked anecdotally, so it might not be sufficient on all
    //! platforms, and for all configurations.
    constexpr std::size_t minStackSizeForErrors = 32 * 1024;
} // end unnamed namespace

#endif // CATCH_CONFIG_WINDOWS_SEH || CATCH_CONFIG_POSIX_SIGNALS

#if defined(CATCH_CONFIG_WINDOWS_SEH)

namespace Catch {

    struct SignalDefs {
        DWORD id;
        const char* name;
    };

    // There is no 1-1 mapping between signals and windows exceptions.
    // Windows can easily distinguish between SO and SigSegV,
    // but SigInt, SigTerm, etc are handled differently.
    static SignalDefs signalDefs[] = {
        {static_cast<DWORD>(EXCEPTION_ILLEGAL_INSTRUCTION), "SIGILL - Illegal instruction signal"},
        {static_cast<DWORD>(EXCEPTION_STACK_OVERFLOW), "SIGSEGV - Stack overflow"},
        {static_cast<DWORD>(EXCEPTION_ACCESS_VIOLATION), "SIGSEGV - Segmentation violation signal"},
        {static_cast<DWORD>(EXCEPTION_INT_DIVIDE_BY_ZERO), "Divide by zero error"},
    };

    static LONG CALLBACK handleVectoredException(PEXCEPTION_POINTERS ExceptionInfo) {
        for (auto const& def : signalDefs) {
            if (ExceptionInfo->ExceptionRecord->ExceptionCode == def.id) {
                reportFatal(def.name);
            }
        }
        // If its not an exception we care about, pass it along.
        // This stops us from eating debugger breaks etc.
        return EXCEPTION_CONTINUE_SEARCH;
    }

    // Since we do not support multiple instantiations, we put these
    // into global variables and rely on cleaning them up in outlined
    // constructors/destructors
    static PVOID exceptionHandlerHandle = nullptr;

    // For MSVC, we reserve part of the stack memory for handling
    // memory overflow structured exception.
    FatalConditionHandler::FatalConditionHandler() {
        ULONG guaranteeSize = static_cast<ULONG>(minStackSizeForErrors);
        if (!SetThreadStackGuarantee(&guaranteeSize)) {
            // We do not want to fully error out, because needing
            // the stack reserve should be rare enough anyway.
            Catch::cerr() << "Failed to reserve piece of stack."
                          << " Stack overflows will not be reported successfully.";
        }
    }

    // We do not attempt to unset the stack guarantee, because
    // Windows does not support lowering the stack size guarantee.
    FatalConditionHandler::~FatalConditionHandler() = default;

    void FatalConditionHandler::engage_platform() {
        // Register as first handler in current chain
        exceptionHandlerHandle = AddVectoredExceptionHandler(1, handleVectoredException);
        if (!exceptionHandlerHandle) {
            CATCH_RUNTIME_ERROR("Could not register vectored exception handler");
        }
    }

    void FatalConditionHandler::disengage_platform() {
        if (!RemoveVectoredExceptionHandler(exceptionHandlerHandle)) {
            CATCH_RUNTIME_ERROR("Could not unregister vectored exception handler");
        }
        exceptionHandlerHandle = nullptr;
    }

} // end namespace Catch

#endif // CATCH_CONFIG_WINDOWS_SEH

#if defined(CATCH_CONFIG_POSIX_SIGNALS)

#include <signal.h>

namespace Catch {

    struct SignalDefs {
        int id;
        const char* name;
    };

    static SignalDefs signalDefs[] = {{SIGINT, "SIGINT - Terminal interrupt signal"},
                                      {SIGILL, "SIGILL - Illegal instruction signal"},
                                      {SIGFPE, "SIGFPE - Floating point error signal"},
                                      {SIGSEGV, "SIGSEGV - Segmentation violation signal"},
                                      {SIGTERM, "SIGTERM - Termination request signal"},
                                      {SIGABRT, "SIGABRT - Abort (abnormal termination) signal"}};

// Older GCCs trigger -Wmissing-field-initializers for T foo = {}
// which is zero initialization, but not explicit. We want to avoid
// that.
#if defined(__GNUC__)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
#endif

    static char* altStackMem = nullptr;
    static std::size_t altStackSize = 0;
    static stack_t oldSigStack{};
    static struct sigaction oldSigActions[sizeof(signalDefs) / sizeof(SignalDefs)]{};

    static void restorePreviousSignalHandlers() {
        // We set signal handlers back to the previous ones. Hopefully
        // nobody overwrote them in the meantime, and doesn't expect
        // their signal handlers to live past ours given that they
        // installed them after ours..
        for (std::size_t i = 0; i < sizeof(signalDefs) / sizeof(SignalDefs); ++i) {
            sigaction(signalDefs[i].id, &oldSigActions[i], nullptr);
        }
        // Return the old stack
        sigaltstack(&oldSigStack, nullptr);
    }

    static void handleSignal(int sig) {
        char const* name = "<unknown signal>";
        for (auto const& def : signalDefs) {
            if (sig == def.id) {
                name = def.name;
                break;
            }
        }
        // We need to restore previous signal handlers and let them do
        // their thing, so that the users can have the debugger break
        // when a signal is raised, and so on.
        restorePreviousSignalHandlers();
        reportFatal(name);
        raise(sig);
    }

    FatalConditionHandler::FatalConditionHandler() {
        assert(!altStackMem && "Cannot initialize POSIX signal handler when one already exists");
        if (altStackSize == 0) {
            altStackSize = std::max(static_cast<size_t>(SIGSTKSZ), minStackSizeForErrors);
        }
        altStackMem = new char[altStackSize]();
    }

    FatalConditionHandler::~FatalConditionHandler() {
        delete[] altStackMem;
        // We signal that another instance can be constructed by zeroing
        // out the pointer.
        altStackMem = nullptr;
    }

    void FatalConditionHandler::engage_platform() {
        stack_t sigStack;
        sigStack.ss_sp = altStackMem;
        sigStack.ss_size = altStackSize;
        sigStack.ss_flags = 0;
        sigaltstack(&sigStack, &oldSigStack);
        struct sigaction sa = {};

        sa.sa_handler = handleSignal;
        sa.sa_flags = SA_ONSTACK;
        for (std::size_t i = 0; i < sizeof(signalDefs) / sizeof(SignalDefs); ++i) {
            sigaction(signalDefs[i].id, &sa, &oldSigActions[i]);
        }
    }

#if defined(__GNUC__)
#pragma GCC diagnostic pop
#endif

    void FatalConditionHandler::disengage_platform() { restorePreviousSignalHandlers(); }

} // end namespace Catch

#endif // CATCH_CONFIG_POSIX_SIGNALS
// end catch_fatal_condition.cpp
// start catch_generators.cpp

#include <limits>
#include <set>

namespace Catch {

    IGeneratorTracker::~IGeneratorTracker() {}

    const char* GeneratorException::what() const noexcept { return m_msg; }

    namespace Generators {

        GeneratorUntypedBase::~GeneratorUntypedBase() {}

        auto acquireGeneratorTracker(StringRef generatorName, SourceLineInfo const& lineInfo)
            -> IGeneratorTracker& {
            return getResultCapture().acquireGeneratorTracker(generatorName, lineInfo);
        }

    } // namespace Generators
} // namespace Catch
// end catch_generators.cpp
// start catch_interfaces_capture.cpp

namespace Catch {
    IResultCapture::~IResultCapture() = default;
}
// end catch_interfaces_capture.cpp
// start catch_interfaces_config.cpp

namespace Catch {
    IConfig::~IConfig() = default;
}
// end catch_interfaces_config.cpp
// start catch_interfaces_exception.cpp

namespace Catch {
    IExceptionTranslator::~IExceptionTranslator() = default;
    IExceptionTranslatorRegistry::~IExceptionTranslatorRegistry() = default;
} // namespace Catch
// end catch_interfaces_exception.cpp
// start catch_interfaces_registry_hub.cpp

namespace Catch {
    IRegistryHub::~IRegistryHub() = default;
    IMutableRegistryHub::~IMutableRegistryHub() = default;
} // namespace Catch
// end catch_interfaces_registry_hub.cpp
// start catch_interfaces_reporter.cpp

// start catch_reporter_listening.h

namespace Catch {

    class ListeningReporter : public IStreamingReporter {
        using Reporters = std::vector<IStreamingReporterPtr>;
        Reporters m_listeners;
        IStreamingReporterPtr m_reporter = nullptr;
        ReporterPreferences m_preferences;

    public:
        ListeningReporter();

        void addListener(IStreamingReporterPtr&& listener);
        void addReporter(IStreamingReporterPtr&& reporter);

    public: // IStreamingReporter
        ReporterPreferences getPreferences() const override;

        void noMatchingTestCases(std::string const& spec) override;

        void reportInvalidArguments(std::string const& arg) override;

        static std::set<Verbosity> getSupportedVerbosities();

#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
        void benchmarkPreparing(std::string const& name) override;
        void benchmarkStarting(BenchmarkInfo const& benchmarkInfo) override;
        void benchmarkEnded(BenchmarkStats<> const& benchmarkStats) override;
        void benchmarkFailed(std::string const&) override;
#endif // CATCH_CONFIG_ENABLE_BENCHMARKING

        void testRunStarting(TestRunInfo const& testRunInfo) override;
        void testGroupStarting(GroupInfo const& groupInfo) override;
        void testCaseStarting(TestCaseInfo const& testInfo) override;
        void sectionStarting(SectionInfo const& sectionInfo) override;
        void assertionStarting(AssertionInfo const& assertionInfo) override;

        // The return value indicates if the messages buffer should be cleared:
        bool assertionEnded(AssertionStats const& assertionStats) override;
        void sectionEnded(SectionStats const& sectionStats) override;
        void testCaseEnded(TestCaseStats const& testCaseStats) override;
        void testGroupEnded(TestGroupStats const& testGroupStats) override;
        void testRunEnded(TestRunStats const& testRunStats) override;

        void skipTest(TestCaseInfo const& testInfo) override;
        bool isMulti() const override;
    };

} // end namespace Catch

// end catch_reporter_listening.h
namespace Catch {

    ReporterConfig::ReporterConfig(IConfigPtr const& _fullConfig) :
        m_stream(&_fullConfig->stream()), m_fullConfig(_fullConfig) {}

    ReporterConfig::ReporterConfig(IConfigPtr const& _fullConfig, std::ostream& _stream) :
        m_stream(&_stream), m_fullConfig(_fullConfig) {}

    std::ostream& ReporterConfig::stream() const { return *m_stream; }
    IConfigPtr ReporterConfig::fullConfig() const { return m_fullConfig; }

    TestRunInfo::TestRunInfo(std::string const& _name) : name(_name) {}

    GroupInfo::GroupInfo(std::string const& _name,
                         std::size_t _groupIndex,
                         std::size_t _groupsCount) :
        name(_name), groupIndex(_groupIndex), groupsCounts(_groupsCount) {}

    AssertionStats::AssertionStats(AssertionResult const& _assertionResult,
                                   std::vector<MessageInfo> const& _infoMessages,
                                   Totals const& _totals) :
        assertionResult(_assertionResult), infoMessages(_infoMessages), totals(_totals) {
        assertionResult.m_resultData.lazyExpression.m_transientExpression =
            _assertionResult.m_resultData.lazyExpression.m_transientExpression;

        if (assertionResult.hasMessage()) {
            // Copy message into messages list.
            // !TBD This should have been done earlier, somewhere
            MessageBuilder builder(assertionResult.getTestMacroName(),
                                   assertionResult.getSourceInfo(),
                                   assertionResult.getResultType());
            builder << assertionResult.getMessage();
            builder.m_info.message = builder.m_stream.str();

            infoMessages.push_back(builder.m_info);
        }
    }

    AssertionStats::~AssertionStats() = default;

    SectionStats::SectionStats(SectionInfo const& _sectionInfo,
                               Counts const& _assertions,
                               double _durationInSeconds,
                               bool _missingAssertions) :
        sectionInfo(_sectionInfo),
        assertions(_assertions),
        durationInSeconds(_durationInSeconds),
        missingAssertions(_missingAssertions) {}

    SectionStats::~SectionStats() = default;

    TestCaseStats::TestCaseStats(TestCaseInfo const& _testInfo,
                                 Totals const& _totals,
                                 std::string const& _stdOut,
                                 std::string const& _stdErr,
                                 bool _aborting) :
        testInfo(_testInfo),
        totals(_totals),
        stdOut(_stdOut),
        stdErr(_stdErr),
        aborting(_aborting) {}

    TestCaseStats::~TestCaseStats() = default;

    TestGroupStats::TestGroupStats(GroupInfo const& _groupInfo,
                                   Totals const& _totals,
                                   bool _aborting) :
        groupInfo(_groupInfo), totals(_totals), aborting(_aborting) {}

    TestGroupStats::TestGroupStats(GroupInfo const& _groupInfo) :
        groupInfo(_groupInfo), aborting(false) {}

    TestGroupStats::~TestGroupStats() = default;

    TestRunStats::TestRunStats(TestRunInfo const& _runInfo, Totals const& _totals, bool _aborting) :
        runInfo(_runInfo), totals(_totals), aborting(_aborting) {}

    TestRunStats::~TestRunStats() = default;

    void IStreamingReporter::fatalErrorEncountered(StringRef) {}
    bool IStreamingReporter::isMulti() const { return false; }

    IReporterFactory::~IReporterFactory() = default;
    IReporterRegistry::~IReporterRegistry() = default;

} // end namespace Catch
// end catch_interfaces_reporter.cpp
// start catch_interfaces_runner.cpp

namespace Catch {
    IRunner::~IRunner() = default;
}
// end catch_interfaces_runner.cpp
// start catch_interfaces_testcase.cpp

namespace Catch {
    ITestInvoker::~ITestInvoker() = default;
    ITestCaseRegistry::~ITestCaseRegistry() = default;
} // namespace Catch
// end catch_interfaces_testcase.cpp
// start catch_leak_detector.cpp

#ifdef CATCH_CONFIG_WINDOWS_CRTDBG
#include <crtdbg.h>

namespace Catch {

    LeakDetector::LeakDetector() {
        int flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
        flag |= _CRTDBG_LEAK_CHECK_DF;
        flag |= _CRTDBG_ALLOC_MEM_DF;
        _CrtSetDbgFlag(flag);
        _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
        _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);
        // Change this to leaking allocation's number to break there
        _CrtSetBreakAlloc(-1);
    }
} // namespace Catch

#else

Catch::LeakDetector::LeakDetector() {}

#endif

Catch::LeakDetector::~LeakDetector() { Catch::cleanUp(); }
// end catch_leak_detector.cpp
// start catch_list.cpp

// start catch_list.h

#include <set>

namespace Catch {

    std::size_t listTests(Config const& config);

    std::size_t listTestsNamesOnly(Config const& config);

    struct TagInfo {
        void add(std::string const& spelling);
        std::string all() const;

        std::set<std::string> spellings;
        std::size_t count = 0;
    };

    std::size_t listTags(Config const& config);

    std::size_t listReporters();

    Option<std::size_t> list(std::shared_ptr<Config> const& config);

} // end namespace Catch

// end catch_list.h
// start catch_text.h

namespace Catch {
    using namespace clara::TextFlow;
}

// end catch_text.h
#include <limits>
#include <algorithm>
#include <iomanip>

namespace Catch {

    std::size_t listTests(Config const& config) {
        TestSpec const& testSpec = config.testSpec();
        if (config.hasTestFilters())
            Catch::cout() << "Matching test cases:\n";
        else {
            Catch::cout() << "All available test cases:\n";
        }

        auto matchedTestCases = filterTests(getAllTestCasesSorted(config), testSpec, config);
        for (auto const& testCaseInfo : matchedTestCases) {
            Colour::Code colour = testCaseInfo.isHidden() ? Colour::SecondaryText : Colour::None;
            Colour colourGuard(colour);

            Catch::cout() << Column(testCaseInfo.name).initialIndent(2).indent(4) << "\n";
            if (config.verbosity() >= Verbosity::High) {
                Catch::cout() << Column(Catch::Detail::stringify(testCaseInfo.lineInfo)).indent(4)
                              << std::endl;
                std::string description = testCaseInfo.description;
                if (description.empty())
                    description = "(NO DESCRIPTION)";
                Catch::cout() << Column(description).indent(4) << std::endl;
            }
            if (!testCaseInfo.tags.empty())
                Catch::cout() << Column(testCaseInfo.tagsAsString()).indent(6) << "\n";
        }

        if (!config.hasTestFilters())
            Catch::cout() << pluralise(matchedTestCases.size(), "test case") << '\n' << std::endl;
        else
            Catch::cout() << pluralise(matchedTestCases.size(), "matching test case") << '\n'
                          << std::endl;
        return matchedTestCases.size();
    }

    std::size_t listTestsNamesOnly(Config const& config) {
        TestSpec const& testSpec = config.testSpec();
        std::size_t matchedTests = 0;
        std::vector<TestCase> matchedTestCases =
            filterTests(getAllTestCasesSorted(config), testSpec, config);
        for (auto const& testCaseInfo : matchedTestCases) {
            matchedTests++;
            if (startsWith(testCaseInfo.name, '#'))
                Catch::cout() << '"' << testCaseInfo.name << '"';
            else
                Catch::cout() << testCaseInfo.name;
            if (config.verbosity() >= Verbosity::High)
                Catch::cout() << "\t@" << testCaseInfo.lineInfo;
            Catch::cout() << std::endl;
        }
        return matchedTests;
    }

    void TagInfo::add(std::string const& spelling) {
        ++count;
        spellings.insert(spelling);
    }

    std::string TagInfo::all() const {
        size_t size = 0;
        for (auto const& spelling : spellings) {
            // Add 2 for the brackes
            size += spelling.size() + 2;
        }

        std::string out;
        out.reserve(size);
        for (auto const& spelling : spellings) {
            out += '[';
            out += spelling;
            out += ']';
        }
        return out;
    }

    std::size_t listTags(Config const& config) {
        TestSpec const& testSpec = config.testSpec();
        if (config.hasTestFilters())
            Catch::cout() << "Tags for matching test cases:\n";
        else {
            Catch::cout() << "All available tags:\n";
        }

        std::map<std::string, TagInfo> tagCounts;

        std::vector<TestCase> matchedTestCases =
            filterTests(getAllTestCasesSorted(config), testSpec, config);
        for (auto const& testCase : matchedTestCases) {
            for (auto const& tagName : testCase.getTestCaseInfo().tags) {
                std::string lcaseTagName = toLower(tagName);
                auto countIt = tagCounts.find(lcaseTagName);
                if (countIt == tagCounts.end())
                    countIt = tagCounts.insert(std::make_pair(lcaseTagName, TagInfo())).first;
                countIt->second.add(tagName);
            }
        }

        for (auto const& tagCount : tagCounts) {
            ReusableStringStream rss;
            rss << "  " << std::setw(2) << tagCount.second.count << "  ";
            auto str = rss.str();
            auto wrapper = Column(tagCount.second.all())
                               .initialIndent(0)
                               .indent(str.size())
                               .width(CATCH_CONFIG_CONSOLE_WIDTH - 10);
            Catch::cout() << str << wrapper << '\n';
        }
        Catch::cout() << pluralise(tagCounts.size(), "tag") << '\n' << std::endl;
        return tagCounts.size();
    }

    std::size_t listReporters() {
        Catch::cout() << "Available reporters:\n";
        IReporterRegistry::FactoryMap const& factories =
            getRegistryHub().getReporterRegistry().getFactories();
        std::size_t maxNameLen = 0;
        for (auto const& factoryKvp : factories)
            maxNameLen = (std::max)(maxNameLen, factoryKvp.first.size());

        for (auto const& factoryKvp : factories) {
            Catch::cout() << Column(factoryKvp.first + ":").indent(2).width(5 + maxNameLen) +
                                 Column(factoryKvp.second->getDescription())
                                     .initialIndent(0)
                                     .indent(2)
                                     .width(CATCH_CONFIG_CONSOLE_WIDTH - maxNameLen - 8)
                          << "\n";
        }
        Catch::cout() << std::endl;
        return factories.size();
    }

    Option<std::size_t> list(std::shared_ptr<Config> const& config) {
        Option<std::size_t> listedCount;
        getCurrentMutableContext().setConfig(config);
        if (config->listTests())
            listedCount = listedCount.valueOr(0) + listTests(*config);
        if (config->listTestNamesOnly())
            listedCount = listedCount.valueOr(0) + listTestsNamesOnly(*config);
        if (config->listTags())
            listedCount = listedCount.valueOr(0) + listTags(*config);
        if (config->listReporters())
            listedCount = listedCount.valueOr(0) + listReporters();
        return listedCount;
    }

} // end namespace Catch
// end catch_list.cpp
// start catch_matchers.cpp

namespace Catch {
    namespace Matchers {
        namespace Impl {

            std::string MatcherUntypedBase::toString() const {
                if (m_cachedToString.empty())
                    m_cachedToString = describe();
                return m_cachedToString;
            }

            MatcherUntypedBase::~MatcherUntypedBase() = default;

        } // namespace Impl
    }     // namespace Matchers

    using namespace Matchers;
    using Matchers::Impl::MatcherBase;

} // namespace Catch
// end catch_matchers.cpp
// start catch_matchers_exception.cpp

namespace Catch {
    namespace Matchers {
        namespace Exception {

            bool ExceptionMessageMatcher::match(std::exception const& ex) const {
                return ex.what() == m_message;
            }

            std::string ExceptionMessageMatcher::describe() const {
                return "exception message matches \"" + m_message + "\"";
            }

        } // namespace Exception
        Exception::ExceptionMessageMatcher Message(std::string const& message) {
            return Exception::ExceptionMessageMatcher(message);
        }

        // namespace Exception
    } // namespace Matchers
} // namespace Catch
// end catch_matchers_exception.cpp
// start catch_matchers_floating.cpp

// start catch_polyfills.hpp

namespace Catch {
    bool isnan(float f);
    bool isnan(double d);
} // namespace Catch

// end catch_polyfills.hpp
// start catch_to_string.hpp

#include <string>

namespace Catch {
    template <typename T> std::string to_string(T const& t) {
#if defined(CATCH_CONFIG_CPP11_TO_STRING)
        return std::to_string(t);
#else
        ReusableStringStream rss;
        rss << t;
        return rss.str();
#endif
    }
} // end namespace Catch

// end catch_to_string.hpp
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstdint>
#include <cstring>
#include <sstream>
#include <type_traits>
#include <iomanip>
#include <limits>

namespace Catch {
    namespace {

        int32_t convert(float f) {
            static_assert(sizeof(float) == sizeof(int32_t),
                          "Important ULP matcher assumption violated");
            int32_t i;
            std::memcpy(&i, &f, sizeof(f));
            return i;
        }

        int64_t convert(double d) {
            static_assert(sizeof(double) == sizeof(int64_t),
                          "Important ULP matcher assumption violated");
            int64_t i;
            std::memcpy(&i, &d, sizeof(d));
            return i;
        }

        template <typename FP> bool almostEqualUlps(FP lhs, FP rhs, uint64_t maxUlpDiff) {
            // Comparison with NaN should always be false.
            // This way we can rule it out before getting into the ugly details
            if (Catch::isnan(lhs) || Catch::isnan(rhs)) {
                return false;
            }

            auto lc = convert(lhs);
            auto rc = convert(rhs);

            if ((lc < 0) != (rc < 0)) {
                // Potentially we can have +0 and -0
                return lhs == rhs;
            }

            // static cast as a workaround for IBM XLC
            auto ulpDiff = std::abs(static_cast<FP>(lc - rc));
            return static_cast<uint64_t>(ulpDiff) <= maxUlpDiff;
        }

#if defined(CATCH_CONFIG_GLOBAL_NEXTAFTER)

        float nextafter(float x, float y) { return ::nextafterf(x, y); }

        double nextafter(double x, double y) { return ::nextafter(x, y); }

#endif // ^^^ CATCH_CONFIG_GLOBAL_NEXTAFTER ^^^

        template <typename FP> FP step(FP start, FP direction, uint64_t steps) {
            for (uint64_t i = 0; i < steps; ++i) {
#if defined(CATCH_CONFIG_GLOBAL_NEXTAFTER)
                start = Catch::nextafter(start, direction);
#else
                start = std::nextafter(start, direction);
#endif
            }
            return start;
        }

        // Performs equivalent check of std::fabs(lhs - rhs) <= margin
        // But without the subtraction to allow for INFINITY in comparison
        bool marginComparison(double lhs, double rhs, double margin) {
            return (lhs + margin >= rhs) && (rhs + margin >= lhs);
        }

        template <typename FloatingPoint> void write(std::ostream& out, FloatingPoint num) {
            out << std::scientific
                << std::setprecision(std::numeric_limits<FloatingPoint>::max_digits10 - 1) << num;
        }

    } // end anonymous namespace

    namespace Matchers {
        namespace Floating {

            enum class FloatingPointKind : uint8_t { Float, Double };

            WithinAbsMatcher::WithinAbsMatcher(double target, double margin) :
                m_target{target}, m_margin{margin} {
                CATCH_ENFORCE(margin >= 0,
                              "Invalid margin: " << margin << '.'
                                                 << " Margin has to be non-negative.");
            }

            // Performs equivalent check of std::fabs(lhs - rhs) <= margin
            // But without the subtraction to allow for INFINITY in comparison
            bool WithinAbsMatcher::match(double const& matchee) const {
                return (matchee + m_margin >= m_target) && (m_target + m_margin >= matchee);
            }

            std::string WithinAbsMatcher::describe() const {
                return "is within " + ::Catch::Detail::stringify(m_margin) + " of " +
                       ::Catch::Detail::stringify(m_target);
            }

            WithinUlpsMatcher::WithinUlpsMatcher(double target,
                                                 uint64_t ulps,
                                                 FloatingPointKind baseType) :
                m_target{target}, m_ulps{ulps}, m_type{baseType} {
                CATCH_ENFORCE(m_type == FloatingPointKind::Double ||
                                  m_ulps < (std::numeric_limits<uint32_t>::max)(),
                              "Provided ULP is impossibly large for a float comparison.");
            }

#if defined(__clang__)
#pragma clang diagnostic push
// Clang <3.5 reports on the default branch in the switch below
#pragma clang diagnostic ignored "-Wunreachable-code"
#endif

            bool WithinUlpsMatcher::match(double const& matchee) const {
                switch (m_type) {
                    case FloatingPointKind::Float:
                        return almostEqualUlps<float>(
                            static_cast<float>(matchee), static_cast<float>(m_target), m_ulps);
                    case FloatingPointKind::Double:
                        return almostEqualUlps<double>(matchee, m_target, m_ulps);
                    default:
                        CATCH_INTERNAL_ERROR("Unknown FloatingPointKind value");
                }
            }

#if defined(__clang__)
#pragma clang diagnostic pop
#endif

            std::string WithinUlpsMatcher::describe() const {
                std::stringstream ret;

                ret << "is within " << m_ulps << " ULPs of ";

                if (m_type == FloatingPointKind::Float) {
                    write(ret, static_cast<float>(m_target));
                    ret << 'f';
                } else {
                    write(ret, m_target);
                }

                ret << " ([";
                if (m_type == FloatingPointKind::Double) {
                    write(ret, step(m_target, static_cast<double>(-INFINITY), m_ulps));
                    ret << ", ";
                    write(ret, step(m_target, static_cast<double>(INFINITY), m_ulps));
                } else {
                    // We have to cast INFINITY to float because of MinGW, see
                    // #1782
                    write(
                        ret,
                        step(static_cast<float>(m_target), static_cast<float>(-INFINITY), m_ulps));
                    ret << ", ";
                    write(ret,
                          step(static_cast<float>(m_target), static_cast<float>(INFINITY), m_ulps));
                }
                ret << "])";

                return ret.str();
            }

            WithinRelMatcher::WithinRelMatcher(double target, double epsilon) :
                m_target(target), m_epsilon(epsilon) {
                CATCH_ENFORCE(m_epsilon >= 0.,
                              "Relative comparison with epsilon <  0 does not "
                              "make sense.");
                CATCH_ENFORCE(m_epsilon < 1.,
                              "Relative comparison with epsilon >= 1 does not "
                              "make sense.");
            }

            bool WithinRelMatcher::match(double const& matchee) const {
                const auto relMargin =
                    m_epsilon * (std::max)(std::fabs(matchee), std::fabs(m_target));
                return marginComparison(matchee, m_target, std::isinf(relMargin) ? 0 : relMargin);
            }

            std::string WithinRelMatcher::describe() const {
                Catch::ReusableStringStream sstr;
                sstr << "and " << m_target << " are within " << m_epsilon * 100.
                     << "% of each other";
                return sstr.str();
            }

        } // namespace Floating

        Floating::WithinUlpsMatcher WithinULP(double target, uint64_t maxUlpDiff) {
            return Floating::WithinUlpsMatcher(
                target, maxUlpDiff, Floating::FloatingPointKind::Double);
        }

        Floating::WithinUlpsMatcher WithinULP(float target, uint64_t maxUlpDiff) {
            return Floating::WithinUlpsMatcher(
                target, maxUlpDiff, Floating::FloatingPointKind::Float);
        }

        Floating::WithinAbsMatcher WithinAbs(double target, double margin) {
            return Floating::WithinAbsMatcher(target, margin);
        }

        Floating::WithinRelMatcher WithinRel(double target, double eps) {
            return Floating::WithinRelMatcher(target, eps);
        }

        Floating::WithinRelMatcher WithinRel(double target) {
            return Floating::WithinRelMatcher(target, std::numeric_limits<double>::epsilon() * 100);
        }

        Floating::WithinRelMatcher WithinRel(float target, float eps) {
            return Floating::WithinRelMatcher(target, eps);
        }

        Floating::WithinRelMatcher WithinRel(float target) {
            return Floating::WithinRelMatcher(target, std::numeric_limits<float>::epsilon() * 100);
        }

    } // namespace Matchers
} // namespace Catch
// end catch_matchers_floating.cpp
// start catch_matchers_generic.cpp

std::string Catch::Matchers::Generic::Detail::finalizeDescription(const std::string& desc) {
    if (desc.empty()) {
        return "matches undescribed predicate";
    } else {
        return "matches predicate: \"" + desc + '"';
    }
}
// end catch_matchers_generic.cpp
// start catch_matchers_string.cpp

#include <regex>

namespace Catch {
    namespace Matchers {

        namespace StdString {

            CasedString::CasedString(std::string const& str,
                                     CaseSensitive::Choice caseSensitivity) :
                m_caseSensitivity(caseSensitivity), m_str(adjustString(str)) {}
            std::string CasedString::adjustString(std::string const& str) const {
                return m_caseSensitivity == CaseSensitive::No ? toLower(str) : str;
            }
            std::string CasedString::caseSensitivitySuffix() const {
                return m_caseSensitivity == CaseSensitive::No ? " (case insensitive)"
                                                              : std::string();
            }

            StringMatcherBase::StringMatcherBase(std::string const& operation,
                                                 CasedString const& comparator) :
                m_comparator(comparator), m_operation(operation) {}

            std::string StringMatcherBase::describe() const {
                std::string description;
                description.reserve(5 + m_operation.size() + m_comparator.m_str.size() +
                                    m_comparator.caseSensitivitySuffix().size());
                description += m_operation;
                description += ": \"";
                description += m_comparator.m_str;
                description += "\"";
                description += m_comparator.caseSensitivitySuffix();
                return description;
            }

            EqualsMatcher::EqualsMatcher(CasedString const& comparator) :
                StringMatcherBase("equals", comparator) {}

            bool EqualsMatcher::match(std::string const& source) const {
                return m_comparator.adjustString(source) == m_comparator.m_str;
            }

            ContainsMatcher::ContainsMatcher(CasedString const& comparator) :
                StringMatcherBase("contains", comparator) {}

            bool ContainsMatcher::match(std::string const& source) const {
                return contains(m_comparator.adjustString(source), m_comparator.m_str);
            }

            StartsWithMatcher::StartsWithMatcher(CasedString const& comparator) :
                StringMatcherBase("starts with", comparator) {}

            bool StartsWithMatcher::match(std::string const& source) const {
                return startsWith(m_comparator.adjustString(source), m_comparator.m_str);
            }

            EndsWithMatcher::EndsWithMatcher(CasedString const& comparator) :
                StringMatcherBase("ends with", comparator) {}

            bool EndsWithMatcher::match(std::string const& source) const {
                return endsWith(m_comparator.adjustString(source), m_comparator.m_str);
            }

            RegexMatcher::RegexMatcher(std::string regex, CaseSensitive::Choice caseSensitivity) :
                m_regex(std::move(regex)), m_caseSensitivity(caseSensitivity) {}

            bool RegexMatcher::match(std::string const& matchee) const {
                auto flags = std::regex::ECMAScript; // ECMAScript is the default syntax
                                                     // option anyway
                if (m_caseSensitivity == CaseSensitive::Choice::No) {
                    flags |= std::regex::icase;
                }
                auto reg = std::regex(m_regex, flags);
                return std::regex_match(matchee, reg);
            }

            std::string RegexMatcher::describe() const {
                return "matches " + ::Catch::Detail::stringify(m_regex) +
                       ((m_caseSensitivity == CaseSensitive::Choice::Yes) ? " case sensitively"
                                                                          : " case insensitively");
            }

        } // namespace StdString

        StdString::EqualsMatcher Equals(std::string const& str,
                                        CaseSensitive::Choice caseSensitivity) {
            return StdString::EqualsMatcher(StdString::CasedString(str, caseSensitivity));
        }
        StdString::ContainsMatcher Contains(std::string const& str,
                                            CaseSensitive::Choice caseSensitivity) {
            return StdString::ContainsMatcher(StdString::CasedString(str, caseSensitivity));
        }
        StdString::EndsWithMatcher EndsWith(std::string const& str,
                                            CaseSensitive::Choice caseSensitivity) {
            return StdString::EndsWithMatcher(StdString::CasedString(str, caseSensitivity));
        }
        StdString::StartsWithMatcher StartsWith(std::string const& str,
                                                CaseSensitive::Choice caseSensitivity) {
            return StdString::StartsWithMatcher(StdString::CasedString(str, caseSensitivity));
        }

        StdString::RegexMatcher Matches(std::string const& regex,
                                        CaseSensitive::Choice caseSensitivity) {
            return StdString::RegexMatcher(regex, caseSensitivity);
        }

    } // namespace Matchers
} // namespace Catch
// end catch_matchers_string.cpp
// start catch_message.cpp

// start catch_uncaught_exceptions.h

namespace Catch {
    bool uncaught_exceptions();
} // end namespace Catch

// end catch_uncaught_exceptions.h
#include <cassert>
#include <stack>

namespace Catch {

    MessageInfo::MessageInfo(StringRef const& _macroName,
                             SourceLineInfo const& _lineInfo,
                             ResultWas::OfType _type) :
        macroName(_macroName), lineInfo(_lineInfo), type(_type), sequence(++globalCount) {}

    bool MessageInfo::operator==(MessageInfo const& other) const {
        return sequence == other.sequence;
    }

    bool MessageInfo::operator<(MessageInfo const& other) const {
        return sequence < other.sequence;
    }

    // This may need protecting if threading support is added
    unsigned int MessageInfo::globalCount = 0;

    ////////////////////////////////////////////////////////////////////////////

    Catch::MessageBuilder::MessageBuilder(StringRef const& macroName,
                                          SourceLineInfo const& lineInfo,
                                          ResultWas::OfType type) :
        m_info(macroName, lineInfo, type) {}

    ////////////////////////////////////////////////////////////////////////////

    ScopedMessage::ScopedMessage(MessageBuilder const& builder) :
        m_info(builder.m_info), m_moved() {
        m_info.message = builder.m_stream.str();
        getResultCapture().pushScopedMessage(m_info);
    }

    ScopedMessage::ScopedMessage(ScopedMessage&& old) : m_info(old.m_info), m_moved() {
        old.m_moved = true;
    }

    ScopedMessage::~ScopedMessage() {
        if (!uncaught_exceptions() && !m_moved) {
            getResultCapture().popScopedMessage(m_info);
        }
    }

    Capturer::Capturer(StringRef macroName,
                       SourceLineInfo const& lineInfo,
                       ResultWas::OfType resultType,
                       StringRef names) {
        auto trimmed = [&](size_t start, size_t end) {
            while (names[start] == ',' || isspace(static_cast<unsigned char>(names[start]))) {
                ++start;
            }
            while (names[end] == ',' || isspace(static_cast<unsigned char>(names[end]))) {
                --end;
            }
            return names.substr(start, end - start + 1);
        };
        auto skipq = [&](size_t start, char quote) {
            for (auto i = start + 1; i < names.size(); ++i) {
                if (names[i] == quote)
                    return i;
                if (names[i] == '\\')
                    ++i;
            }
            CATCH_INTERNAL_ERROR("CAPTURE parsing encountered unmatched quote");
        };

        size_t start = 0;
        std::stack<char> openings;
        for (size_t pos = 0; pos < names.size(); ++pos) {
            char c = names[pos];
            switch (c) {
                case '[':
                case '{':
                case '(':
                    // It is basically impossible to disambiguate between
                    // comparison and start of template args in this context
                    //            case '<':
                    openings.push(c);
                    break;
                case ']':
                case '}':
                case ')':
                    //           case '>':
                    openings.pop();
                    break;
                case '"':
                case '\'':
                    pos = skipq(pos, c);
                    break;
                case ',':
                    if (start != pos && openings.empty()) {
                        m_messages.emplace_back(macroName, lineInfo, resultType);
                        m_messages.back().message = static_cast<std::string>(trimmed(start, pos));
                        m_messages.back().message += " := ";
                        start = pos;
                    }
            }
        }
        assert(openings.empty() && "Mismatched openings");
        m_messages.emplace_back(macroName, lineInfo, resultType);
        m_messages.back().message = static_cast<std::string>(trimmed(start, names.size() - 1));
        m_messages.back().message += " := ";
    }
    Capturer::~Capturer() {
        if (!uncaught_exceptions()) {
            assert(m_captured == m_messages.size());
            for (size_t i = 0; i < m_captured; ++i)
                m_resultCapture.popScopedMessage(m_messages[i]);
        }
    }

    void Capturer::captureValue(size_t index, std::string const& value) {
        assert(index < m_messages.size());
        m_messages[index].message += value;
        m_resultCapture.pushScopedMessage(m_messages[index]);
        m_captured++;
    }

} // end namespace Catch
// end catch_message.cpp
// start catch_output_redirect.cpp

// start catch_output_redirect.h
#ifndef TWOBLUECUBES_CATCH_OUTPUT_REDIRECT_H
#define TWOBLUECUBES_CATCH_OUTPUT_REDIRECT_H

#include <cstdio>
#include <iosfwd>
#include <string>

namespace Catch {

    class RedirectedStream {
        std::ostream& m_originalStream;
        std::ostream& m_redirectionStream;
        std::streambuf* m_prevBuf;

    public:
        RedirectedStream(std::ostream& originalStream, std::ostream& redirectionStream);
        ~RedirectedStream();
    };

    class RedirectedStdOut {
        ReusableStringStream m_rss;
        RedirectedStream m_cout;

    public:
        RedirectedStdOut();
        auto str() const -> std::string;
    };

    // StdErr has two constituent streams in C++, std::cerr and std::clog
    // This means that we need to redirect 2 streams into 1 to keep proper
    // order of writes
    class RedirectedStdErr {
        ReusableStringStream m_rss;
        RedirectedStream m_cerr;
        RedirectedStream m_clog;

    public:
        RedirectedStdErr();
        auto str() const -> std::string;
    };

    class RedirectedStreams {
    public:
        RedirectedStreams(RedirectedStreams const&) = delete;
        RedirectedStreams& operator=(RedirectedStreams const&) = delete;
        RedirectedStreams(RedirectedStreams&&) = delete;
        RedirectedStreams& operator=(RedirectedStreams&&) = delete;

        RedirectedStreams(std::string& redirectedCout, std::string& redirectedCerr);
        ~RedirectedStreams();

    private:
        std::string& m_redirectedCout;
        std::string& m_redirectedCerr;
        RedirectedStdOut m_redirectedStdOut;
        RedirectedStdErr m_redirectedStdErr;
    };

#if defined(CATCH_CONFIG_NEW_CAPTURE)

    // Windows's implementation of std::tmpfile is terrible (it tries
    // to create a file inside system folder, thus requiring elevated
    // privileges for the binary), so we have to use tmpnam(_s) and
    // create the file ourselves there.
    class TempFile {
    public:
        TempFile(TempFile const&) = delete;
        TempFile& operator=(TempFile const&) = delete;
        TempFile(TempFile&&) = delete;
        TempFile& operator=(TempFile&&) = delete;

        TempFile();
        ~TempFile();

        std::FILE* getFile();
        std::string getContents();

    private:
        std::FILE* m_file = nullptr;
#if defined(_MSC_VER)
        char m_buffer[L_tmpnam] = {0};
#endif
    };

    class OutputRedirect {
    public:
        OutputRedirect(OutputRedirect const&) = delete;
        OutputRedirect& operator=(OutputRedirect const&) = delete;
        OutputRedirect(OutputRedirect&&) = delete;
        OutputRedirect& operator=(OutputRedirect&&) = delete;

        OutputRedirect(std::string& stdout_dest, std::string& stderr_dest);
        ~OutputRedirect();

    private:
        int m_originalStdout = -1;
        int m_originalStderr = -1;
        TempFile m_stdoutFile;
        TempFile m_stderrFile;
        std::string& m_stdoutDest;
        std::string& m_stderrDest;
    };

#endif

} // end namespace Catch

#endif // TWOBLUECUBES_CATCH_OUTPUT_REDIRECT_H
// end catch_output_redirect.h
#include <cstdio>
#include <cstring>
#include <fstream>
#include <sstream>
#include <stdexcept>

#if defined(CATCH_CONFIG_NEW_CAPTURE)
#if defined(_MSC_VER)
#include <io.h> //_dup and _dup2
#define dup _dup
#define dup2 _dup2
#define fileno _fileno
#else
#include <unistd.h> // dup and dup2
#endif
#endif

namespace Catch {

    RedirectedStream::RedirectedStream(std::ostream& originalStream,
                                       std::ostream& redirectionStream) :
        m_originalStream(originalStream),
        m_redirectionStream(redirectionStream),
        m_prevBuf(m_originalStream.rdbuf()) {
        m_originalStream.rdbuf(m_redirectionStream.rdbuf());
    }

    RedirectedStream::~RedirectedStream() { m_originalStream.rdbuf(m_prevBuf); }

    RedirectedStdOut::RedirectedStdOut() : m_cout(Catch::cout(), m_rss.get()) {}
    auto RedirectedStdOut::str() const -> std::string { return m_rss.str(); }

    RedirectedStdErr::RedirectedStdErr() :
        m_cerr(Catch::cerr(), m_rss.get()), m_clog(Catch::clog(), m_rss.get()) {}
    auto RedirectedStdErr::str() const -> std::string { return m_rss.str(); }

    RedirectedStreams::RedirectedStreams(std::string& redirectedCout, std::string& redirectedCerr) :
        m_redirectedCout(redirectedCout), m_redirectedCerr(redirectedCerr) {}

    RedirectedStreams::~RedirectedStreams() {
        m_redirectedCout += m_redirectedStdOut.str();
        m_redirectedCerr += m_redirectedStdErr.str();
    }

#if defined(CATCH_CONFIG_NEW_CAPTURE)

#if defined(_MSC_VER)
    TempFile::TempFile() {
        if (tmpnam_s(m_buffer)) {
            CATCH_RUNTIME_ERROR("Could not get a temp filename");
        }
        if (fopen_s(&m_file, m_buffer, "w+")) {
            char buffer[100];
            if (strerror_s(buffer, errno)) {
                CATCH_RUNTIME_ERROR("Could not translate errno to a string");
            }
            CATCH_RUNTIME_ERROR("Could not open the temp file: '" << m_buffer
                                                                  << "' because: " << buffer);
        }
    }
#else
    TempFile::TempFile() {
        m_file = std::tmpfile();
        if (!m_file) {
            CATCH_RUNTIME_ERROR("Could not create a temp file.");
        }
    }

#endif

    TempFile::~TempFile() {
        // TBD: What to do about errors here?
        std::fclose(m_file);
        // We manually create the file on Windows only, on Linux
        // it will be autodeleted
#if defined(_MSC_VER)
        std::remove(m_buffer);
#endif
    }

    FILE* TempFile::getFile() { return m_file; }

    std::string TempFile::getContents() {
        std::stringstream sstr;
        char buffer[100] = {};
        std::rewind(m_file);
        while (std::fgets(buffer, sizeof(buffer), m_file)) {
            sstr << buffer;
        }
        return sstr.str();
    }

    OutputRedirect::OutputRedirect(std::string& stdout_dest, std::string& stderr_dest) :
        m_originalStdout(dup(1)),
        m_originalStderr(dup(2)),
        m_stdoutDest(stdout_dest),
        m_stderrDest(stderr_dest) {
        dup2(fileno(m_stdoutFile.getFile()), 1);
        dup2(fileno(m_stderrFile.getFile()), 2);
    }

    OutputRedirect::~OutputRedirect() {
        Catch::cout() << std::flush;
        fflush(stdout);
        // Since we support overriding these streams, we flush cerr
        // even though std::cerr is unbuffered
        Catch::cerr() << std::flush;
        Catch::clog() << std::flush;
        fflush(stderr);

        dup2(m_originalStdout, 1);
        dup2(m_originalStderr, 2);

        m_stdoutDest += m_stdoutFile.getContents();
        m_stderrDest += m_stderrFile.getContents();
    }

#endif // CATCH_CONFIG_NEW_CAPTURE

} // namespace Catch

#if defined(CATCH_CONFIG_NEW_CAPTURE)
#if defined(_MSC_VER)
#undef dup
#undef dup2
#undef fileno
#endif
#endif
// end catch_output_redirect.cpp
// start catch_polyfills.cpp

#include <cmath>

namespace Catch {

#if !defined(CATCH_CONFIG_POLYFILL_ISNAN)
    bool isnan(float f) { return std::isnan(f); }
    bool isnan(double d) { return std::isnan(d); }
#else
    // For now we only use this for embarcadero
    bool isnan(float f) { return std::_isnan(f); }
    bool isnan(double d) { return std::_isnan(d); }
#endif

} // end namespace Catch
// end catch_polyfills.cpp
// start catch_random_number_generator.cpp

namespace Catch {

    namespace {

#if defined(_MSC_VER)
#pragma warning(push)
#pragma warning(disable : 4146) // we negate uint32 during the rotate
#endif
        // Safe rotr implementation thanks to John Regehr
        uint32_t rotate_right(uint32_t val, uint32_t count) {
            const uint32_t mask = 31;
            count &= mask;
            return (val >> count) | (val << (-count & mask));
        }

#if defined(_MSC_VER)
#pragma warning(pop)
#endif

    } // namespace

    SimplePcg32::SimplePcg32(result_type seed_) { seed(seed_); }

    void SimplePcg32::seed(result_type seed_) {
        m_state = 0;
        (*this)();
        m_state += seed_;
        (*this)();
    }

    void SimplePcg32::discard(uint64_t skip) {
        // We could implement this to run in O(log n) steps, but this
        // should suffice for our use case.
        for (uint64_t s = 0; s < skip; ++s) {
            static_cast<void>((*this)());
        }
    }

    SimplePcg32::result_type SimplePcg32::operator()() {
        // prepare the output value
        const uint32_t xorshifted = static_cast<uint32_t>(((m_state >> 18u) ^ m_state) >> 27u);
        const auto output = rotate_right(xorshifted, m_state >> 59u);

        // advance state
        m_state = m_state * 6364136223846793005ULL + s_inc;

        return output;
    }

    bool operator==(SimplePcg32 const& lhs, SimplePcg32 const& rhs) {
        return lhs.m_state == rhs.m_state;
    }

    bool operator!=(SimplePcg32 const& lhs, SimplePcg32 const& rhs) {
        return lhs.m_state != rhs.m_state;
    }
} // namespace Catch
// end catch_random_number_generator.cpp
// start catch_registry_hub.cpp

// start catch_test_case_registry_impl.h

#include <vector>
#include <set>
#include <algorithm>
#include <ios>

namespace Catch {

    class TestCase;
    struct IConfig;

    std::vector<TestCase> sortTests(IConfig const& config,
                                    std::vector<TestCase> const& unsortedTestCases);

    bool isThrowSafe(TestCase const& testCase, IConfig const& config);
    bool matchTest(TestCase const& testCase, TestSpec const& testSpec, IConfig const& config);

    void enforceNoDuplicateTestCases(std::vector<TestCase> const& functions);

    std::vector<TestCase> filterTests(std::vector<TestCase> const& testCases,
                                      TestSpec const& testSpec,
                                      IConfig const& config);
    std::vector<TestCase> const& getAllTestCasesSorted(IConfig const& config);

    class TestRegistry : public ITestCaseRegistry {
    public:
        virtual ~TestRegistry() = default;

        virtual void registerTest(TestCase const& testCase);

        std::vector<TestCase> const& getAllTests() const override;
        std::vector<TestCase> const& getAllTestsSorted(IConfig const& config) const override;

    private:
        std::vector<TestCase> m_functions;
        mutable RunTests::InWhatOrder m_currentSortOrder = RunTests::InDeclarationOrder;
        mutable std::vector<TestCase> m_sortedFunctions;
        std::size_t m_unnamedCount = 0;
        std::ios_base::Init m_ostreamInit; // Forces cout/ cerr to be initialised
    };

    ///////////////////////////////////////////////////////////////////////////

    class TestInvokerAsFunction : public ITestInvoker {
        void (*m_testAsFunction)();

    public:
        TestInvokerAsFunction(void (*testAsFunction)()) noexcept;

        void invoke() const override;
    };

    std::string extractClassName(StringRef const& classOrQualifiedMethodName);

    ///////////////////////////////////////////////////////////////////////////

} // end namespace Catch

// end catch_test_case_registry_impl.h
// start catch_reporter_registry.h

#include <map>

namespace Catch {

    class ReporterRegistry : public IReporterRegistry {

    public:
        ~ReporterRegistry() override;

        IStreamingReporterPtr create(std::string const& name,
                                     IConfigPtr const& config) const override;

        void registerReporter(std::string const& name, IReporterFactoryPtr const& factory);
        void registerListener(IReporterFactoryPtr const& factory);

        FactoryMap const& getFactories() const override;
        Listeners const& getListeners() const override;

    private:
        FactoryMap m_factories;
        Listeners m_listeners;
    };
} // namespace Catch

// end catch_reporter_registry.h
// start catch_tag_alias_registry.h

// start catch_tag_alias.h

#include <string>

namespace Catch {

    struct TagAlias {
        TagAlias(std::string const& _tag, SourceLineInfo _lineInfo);

        std::string tag;
        SourceLineInfo lineInfo;
    };

} // end namespace Catch

// end catch_tag_alias.h
#include <map>

namespace Catch {

    class TagAliasRegistry : public ITagAliasRegistry {
    public:
        ~TagAliasRegistry() override;
        TagAlias const* find(std::string const& alias) const override;
        std::string expandAliases(std::string const& unexpandedTestSpec) const override;
        void add(std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo);

    private:
        std::map<std::string, TagAlias> m_registry;
    };

} // end namespace Catch

// end catch_tag_alias_registry.h
// start catch_startup_exception_registry.h

#include <vector>
#include <exception>

namespace Catch {

    class StartupExceptionRegistry {
#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
    public:
        void add(std::exception_ptr const& exception) noexcept;
        std::vector<std::exception_ptr> const& getExceptions() const noexcept;

    private:
        std::vector<std::exception_ptr> m_exceptions;
#endif
    };

} // end namespace Catch

// end catch_startup_exception_registry.h
// start catch_singletons.hpp

namespace Catch {

    struct ISingleton {
        virtual ~ISingleton();
    };

    void addSingleton(ISingleton* singleton);
    void cleanupSingletons();

    template <typename SingletonImplT,
              typename InterfaceT = SingletonImplT,
              typename MutableInterfaceT = InterfaceT>
    class Singleton : SingletonImplT, public ISingleton {

        static auto getInternal() -> Singleton* {
            static Singleton* s_instance = nullptr;
            if (!s_instance) {
                s_instance = new Singleton;
                addSingleton(s_instance);
            }
            return s_instance;
        }

    public:
        static auto get() -> InterfaceT const& { return *getInternal(); }
        static auto getMutable() -> MutableInterfaceT& { return *getInternal(); }
    };

} // namespace Catch

// end catch_singletons.hpp
namespace Catch {

    namespace {

        class RegistryHub : public IRegistryHub, public IMutableRegistryHub, private NonCopyable {

        public: // IRegistryHub
            RegistryHub() = default;
            IReporterRegistry const& getReporterRegistry() const override {
                return m_reporterRegistry;
            }
            ITestCaseRegistry const& getTestCaseRegistry() const override {
                return m_testCaseRegistry;
            }
            IExceptionTranslatorRegistry const& getExceptionTranslatorRegistry() const override {
                return m_exceptionTranslatorRegistry;
            }
            ITagAliasRegistry const& getTagAliasRegistry() const override {
                return m_tagAliasRegistry;
            }
            StartupExceptionRegistry const& getStartupExceptionRegistry() const override {
                return m_exceptionRegistry;
            }

        public: // IMutableRegistryHub
            void registerReporter(std::string const& name,
                                  IReporterFactoryPtr const& factory) override {
                m_reporterRegistry.registerReporter(name, factory);
            }
            void registerListener(IReporterFactoryPtr const& factory) override {
                m_reporterRegistry.registerListener(factory);
            }
            void registerTest(TestCase const& testInfo) override {
                m_testCaseRegistry.registerTest(testInfo);
            }
            void registerTranslator(const IExceptionTranslator* translator) override {
                m_exceptionTranslatorRegistry.registerTranslator(translator);
            }
            void registerTagAlias(std::string const& alias,
                                  std::string const& tag,
                                  SourceLineInfo const& lineInfo) override {
                m_tagAliasRegistry.add(alias, tag, lineInfo);
            }
            void registerStartupException() noexcept override {
#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
                m_exceptionRegistry.add(std::current_exception());
#else
                CATCH_INTERNAL_ERROR("Attempted to register active exception "
                                     "under CATCH_CONFIG_DISABLE_EXCEPTIONS!");
#endif
            }
            IMutableEnumValuesRegistry& getMutableEnumValuesRegistry() override {
                return m_enumValuesRegistry;
            }

        private:
            TestRegistry m_testCaseRegistry;
            ReporterRegistry m_reporterRegistry;
            ExceptionTranslatorRegistry m_exceptionTranslatorRegistry;
            TagAliasRegistry m_tagAliasRegistry;
            StartupExceptionRegistry m_exceptionRegistry;
            Detail::EnumValuesRegistry m_enumValuesRegistry;
        };
    } // namespace

    using RegistryHubSingleton = Singleton<RegistryHub, IRegistryHub, IMutableRegistryHub>;

    IRegistryHub const& getRegistryHub() { return RegistryHubSingleton::get(); }
    IMutableRegistryHub& getMutableRegistryHub() { return RegistryHubSingleton::getMutable(); }
    void cleanUp() {
        cleanupSingletons();
        cleanUpContext();
    }
    std::string translateActiveException() {
        return getRegistryHub().getExceptionTranslatorRegistry().translateActiveException();
    }

} // end namespace Catch
// end catch_registry_hub.cpp
// start catch_reporter_registry.cpp

namespace Catch {

    ReporterRegistry::~ReporterRegistry() = default;

    IStreamingReporterPtr ReporterRegistry::create(std::string const& name,
                                                   IConfigPtr const& config) const {
        auto it = m_factories.find(name);
        if (it == m_factories.end())
            return nullptr;
        return it->second->create(ReporterConfig(config));
    }

    void ReporterRegistry::registerReporter(std::string const& name,
                                            IReporterFactoryPtr const& factory) {
        m_factories.emplace(name, factory);
    }
    void ReporterRegistry::registerListener(IReporterFactoryPtr const& factory) {
        m_listeners.push_back(factory);
    }

    IReporterRegistry::FactoryMap const& ReporterRegistry::getFactories() const {
        return m_factories;
    }
    IReporterRegistry::Listeners const& ReporterRegistry::getListeners() const {
        return m_listeners;
    }

} // namespace Catch
// end catch_reporter_registry.cpp
// start catch_result_type.cpp

namespace Catch {

    bool isOk(ResultWas::OfType resultType) { return (resultType & ResultWas::FailureBit) == 0; }
    bool isJustInfo(int flags) { return flags == ResultWas::Info; }

    ResultDisposition::Flags operator|(ResultDisposition::Flags lhs, ResultDisposition::Flags rhs) {
        return static_cast<ResultDisposition::Flags>(static_cast<int>(lhs) | static_cast<int>(rhs));
    }

    bool shouldContinueOnFailure(int flags) {
        return (flags & ResultDisposition::ContinueOnFailure) != 0;
    }
    bool shouldSuppressFailure(int flags) { return (flags & ResultDisposition::SuppressFail) != 0; }

} // end namespace Catch
// end catch_result_type.cpp
// start catch_run_context.cpp

#include <cassert>
#include <algorithm>
#include <sstream>

namespace Catch {

    namespace Generators {
        struct GeneratorTracker : TestCaseTracking::TrackerBase, IGeneratorTracker {
            GeneratorBasePtr m_generator;

            GeneratorTracker(TestCaseTracking::NameAndLocation const& nameAndLocation,
                             TrackerContext& ctx,
                             ITracker* parent) :
                TrackerBase(nameAndLocation, ctx, parent) {}
            ~GeneratorTracker();

            static GeneratorTracker&
            acquire(TrackerContext& ctx, TestCaseTracking::NameAndLocation const& nameAndLocation) {
                std::shared_ptr<GeneratorTracker> tracker;

                ITracker& currentTracker = ctx.currentTracker();
                // Under specific circumstances, the generator we want
                // to acquire is also the current tracker. If this is
                // the case, we have to avoid looking through current
                // tracker's children, and instead return the current
                // tracker.
                // A case where this check is important is e.g.
                //     for (int i = 0; i < 5; ++i) {
                //         int n = GENERATE(1, 2);
                //     }
                //
                // without it, the code above creates 5 nested generators.
                if (currentTracker.nameAndLocation() == nameAndLocation) {
                    auto thisTracker = currentTracker.parent().findChild(nameAndLocation);
                    assert(thisTracker);
                    assert(thisTracker->isGeneratorTracker());
                    tracker = std::static_pointer_cast<GeneratorTracker>(thisTracker);
                } else if (TestCaseTracking::ITrackerPtr childTracker =
                               currentTracker.findChild(nameAndLocation)) {
                    assert(childTracker);
                    assert(childTracker->isGeneratorTracker());
                    tracker = std::static_pointer_cast<GeneratorTracker>(childTracker);
                } else {
                    tracker =
                        std::make_shared<GeneratorTracker>(nameAndLocation, ctx, &currentTracker);
                    currentTracker.addChild(tracker);
                }

                if (!tracker->isComplete()) {
                    tracker->open();
                }

                return *tracker;
            }

            // TrackerBase interface
            bool isGeneratorTracker() const override { return true; }
            auto hasGenerator() const -> bool override { return !!m_generator; }
            void close() override {
                TrackerBase::close();
                // If a generator has a child (it is followed by a section)
                // and none of its children have started, then we must wait
                // until later to start consuming its values.
                // This catches cases where `GENERATE` is placed between two
                // `SECTION`s.
                // **The check for m_children.empty cannot be removed**.
                // doing so would break `GENERATE` _not_ followed by `SECTION`s.
                const bool should_wait_for_child = [&]() {
                    // No children -> nobody to wait for
                    if (m_children.empty()) {
                        return false;
                    }
                    // If at least one child started executing, don't wait
                    if (std::find_if(m_children.begin(),
                                     m_children.end(),
                                     [](TestCaseTracking::ITrackerPtr tracker) {
                                         return tracker->hasStarted();
                                     }) != m_children.end())
                    {
                        return false;
                    }

                    // No children have started. We need to check if they _can_
                    // start, and thus we should wait for them, or they cannot
                    // start (due to filters), and we shouldn't wait for them
                    auto* parent = m_parent;
                    // This is safe: there is always at least one section
                    // tracker in a test case tracking tree
                    while (!parent->isSectionTracker()) {
                        parent = &(parent->parent());
                    }
                    assert(parent && "Missing root (test case) level section");

                    auto const& parentSection = static_cast<SectionTracker&>(*parent);
                    auto const& filters = parentSection.getFilters();
                    // No filters -> no restrictions on running sections
                    if (filters.empty()) {
                        return true;
                    }

                    for (auto const& child : m_children) {
                        if (child->isSectionTracker() &&
                            std::find(filters.begin(),
                                      filters.end(),
                                      static_cast<SectionTracker&>(*child).trimmedName()) !=
                                filters.end())
                        {
                            return true;
                        }
                    }
                    return false;
                }();

                // This check is a bit tricky, because m_generator->next()
                // has a side-effect, where it consumes generator's current
                // value, but we do not want to invoke the side-effect if
                // this generator is still waiting for any child to start.
                if (should_wait_for_child ||
                    (m_runState == CompletedSuccessfully && m_generator->next())) {
                    m_children.clear();
                    m_runState = Executing;
                }
            }

            // IGeneratorTracker interface
            auto getGenerator() const -> GeneratorBasePtr const& override { return m_generator; }
            void setGenerator(GeneratorBasePtr&& generator) override {
                m_generator = std::move(generator);
            }
        };
        GeneratorTracker::~GeneratorTracker() {}
    } // namespace Generators

    RunContext::RunContext(IConfigPtr const& _config, IStreamingReporterPtr&& reporter) :
        m_runInfo(_config->name()),
        m_context(getCurrentMutableContext()),
        m_config(_config),
        m_reporter(std::move(reporter)),
        m_lastAssertionInfo{
            StringRef(), SourceLineInfo("", 0), StringRef(), ResultDisposition::Normal},
        m_includeSuccessfulResults(m_config->includeSuccessfulResults() ||
                                   m_reporter->getPreferences().shouldReportAllAssertions) {
        m_context.setRunner(this);
        m_context.setConfig(m_config);
        m_context.setResultCapture(this);
        m_reporter->testRunStarting(m_runInfo);
    }

    RunContext::~RunContext() {
        m_reporter->testRunEnded(TestRunStats(m_runInfo, m_totals, aborting()));
    }

    void RunContext::testGroupStarting(std::string const& testSpec,
                                       std::size_t groupIndex,
                                       std::size_t groupsCount) {
        m_reporter->testGroupStarting(GroupInfo(testSpec, groupIndex, groupsCount));
    }

    void RunContext::testGroupEnded(std::string const& testSpec,
                                    Totals const& totals,
                                    std::size_t groupIndex,
                                    std::size_t groupsCount) {
        m_reporter->testGroupEnded(
            TestGroupStats(GroupInfo(testSpec, groupIndex, groupsCount), totals, aborting()));
    }

    Totals RunContext::runTest(TestCase const& testCase) {
        Totals prevTotals = m_totals;

        std::string redirectedCout;
        std::string redirectedCerr;

        auto const& testInfo = testCase.getTestCaseInfo();

        m_reporter->testCaseStarting(testInfo);

        m_activeTestCase = &testCase;

        ITracker& rootTracker = m_trackerContext.startRun();
        assert(rootTracker.isSectionTracker());
        static_cast<SectionTracker&>(rootTracker).addInitialFilters(m_config->getSectionsToRun());
        do {
            m_trackerContext.startCycle();
            m_testCaseTracker = &SectionTracker::acquire(
                m_trackerContext,
                TestCaseTracking::NameAndLocation(testInfo.name, testInfo.lineInfo));
            runCurrentTest(redirectedCout, redirectedCerr);
        } while (!m_testCaseTracker->isSuccessfullyCompleted() && !aborting());

        Totals deltaTotals = m_totals.delta(prevTotals);
        if (testInfo.expectedToFail() && deltaTotals.testCases.passed > 0) {
            deltaTotals.assertions.failed++;
            deltaTotals.testCases.passed--;
            deltaTotals.testCases.failed++;
        }
        m_totals.testCases += deltaTotals.testCases;
        m_reporter->testCaseEnded(
            TestCaseStats(testInfo, deltaTotals, redirectedCout, redirectedCerr, aborting()));

        m_activeTestCase = nullptr;
        m_testCaseTracker = nullptr;

        return deltaTotals;
    }

    IConfigPtr RunContext::config() const { return m_config; }

    IStreamingReporter& RunContext::reporter() const { return *m_reporter; }

    void RunContext::assertionEnded(AssertionResult const& result) {
        if (result.getResultType() == ResultWas::Ok) {
            m_totals.assertions.passed++;
            m_lastAssertionPassed = true;
        } else if (!result.isOk()) {
            m_lastAssertionPassed = false;
            if (m_activeTestCase->getTestCaseInfo().okToFail())
                m_totals.assertions.failedButOk++;
            else
                m_totals.assertions.failed++;
        } else {
            m_lastAssertionPassed = true;
        }

        // We have no use for the return value (whether messages should be
        // cleared), because messages were made scoped and should be let to
        // clear themselves out.
        static_cast<void>(m_reporter->assertionEnded(AssertionStats(result, m_messages, m_totals)));

        if (result.getResultType() != ResultWas::Warning)
            m_messageScopes.clear();

        // Reset working state
        resetAssertionInfo();
        m_lastResult = result;
    }
    void RunContext::resetAssertionInfo() {
        m_lastAssertionInfo.macroName = StringRef();
        m_lastAssertionInfo.capturedExpression = "{Unknown expression after the reported line}"_sr;
    }

    bool RunContext::sectionStarted(SectionInfo const& sectionInfo, Counts& assertions) {
        ITracker& sectionTracker = SectionTracker::acquire(
            m_trackerContext,
            TestCaseTracking::NameAndLocation(sectionInfo.name, sectionInfo.lineInfo));
        if (!sectionTracker.isOpen())
            return false;
        m_activeSections.push_back(&sectionTracker);

        m_lastAssertionInfo.lineInfo = sectionInfo.lineInfo;

        m_reporter->sectionStarting(sectionInfo);

        assertions = m_totals.assertions;

        return true;
    }
    auto RunContext::acquireGeneratorTracker(StringRef generatorName,
                                             SourceLineInfo const& lineInfo) -> IGeneratorTracker& {
        using namespace Generators;
        GeneratorTracker& tracker = GeneratorTracker::acquire(
            m_trackerContext,
            TestCaseTracking::NameAndLocation(static_cast<std::string>(generatorName), lineInfo));
        m_lastAssertionInfo.lineInfo = lineInfo;
        return tracker;
    }

    bool RunContext::testForMissingAssertions(Counts& assertions) {
        if (assertions.total() != 0)
            return false;
        if (!m_config->warnAboutMissingAssertions())
            return false;
        if (m_trackerContext.currentTracker().hasChildren())
            return false;
        m_totals.assertions.failed++;
        assertions.failed++;
        return true;
    }

    void RunContext::sectionEnded(SectionEndInfo const& endInfo) {
        Counts assertions = m_totals.assertions - endInfo.prevAssertions;
        bool missingAssertions = testForMissingAssertions(assertions);

        if (!m_activeSections.empty()) {
            m_activeSections.back()->close();
            m_activeSections.pop_back();
        }

        m_reporter->sectionEnded(SectionStats(
            endInfo.sectionInfo, assertions, endInfo.durationInSeconds, missingAssertions));
        m_messages.clear();
        m_messageScopes.clear();
    }

    void RunContext::sectionEndedEarly(SectionEndInfo const& endInfo) {
        if (m_unfinishedSections.empty())
            m_activeSections.back()->fail();
        else
            m_activeSections.back()->close();
        m_activeSections.pop_back();

        m_unfinishedSections.push_back(endInfo);
    }

#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
    void RunContext::benchmarkPreparing(std::string const& name) {
        m_reporter->benchmarkPreparing(name);
    }
    void RunContext::benchmarkStarting(BenchmarkInfo const& info) {
        m_reporter->benchmarkStarting(info);
    }
    void RunContext::benchmarkEnded(BenchmarkStats<> const& stats) {
        m_reporter->benchmarkEnded(stats);
    }
    void RunContext::benchmarkFailed(std::string const& error) {
        m_reporter->benchmarkFailed(error);
    }
#endif // CATCH_CONFIG_ENABLE_BENCHMARKING

    void RunContext::pushScopedMessage(MessageInfo const& message) {
        m_messages.push_back(message);
    }

    void RunContext::popScopedMessage(MessageInfo const& message) {
        m_messages.erase(std::remove(m_messages.begin(), m_messages.end(), message),
                         m_messages.end());
    }

    void RunContext::emplaceUnscopedMessage(MessageBuilder const& builder) {
        m_messageScopes.emplace_back(builder);
    }

    std::string RunContext::getCurrentTestName() const {
        return m_activeTestCase ? m_activeTestCase->getTestCaseInfo().name : std::string();
    }

    const AssertionResult* RunContext::getLastResult() const { return &(*m_lastResult); }

    void RunContext::exceptionEarlyReported() { m_shouldReportUnexpected = false; }

    void RunContext::handleFatalErrorCondition(StringRef message) {
        // First notify reporter that bad things happened
        m_reporter->fatalErrorEncountered(message);

        // Don't rebuild the result -- the stringification itself can cause more
        // fatal errors Instead, fake a result data.
        AssertionResultData tempResult(ResultWas::FatalErrorCondition, {false});
        tempResult.message = static_cast<std::string>(message);
        AssertionResult result(m_lastAssertionInfo, tempResult);

        assertionEnded(result);

        handleUnfinishedSections();

        // Recreate section for test case (as we will lose the one that was in
        // scope)
        auto const& testCaseInfo = m_activeTestCase->getTestCaseInfo();
        SectionInfo testCaseSection(testCaseInfo.lineInfo, testCaseInfo.name);

        Counts assertions;
        assertions.failed = 1;
        SectionStats testCaseSectionStats(testCaseSection, assertions, 0, false);
        m_reporter->sectionEnded(testCaseSectionStats);

        auto const& testInfo = m_activeTestCase->getTestCaseInfo();

        Totals deltaTotals;
        deltaTotals.testCases.failed = 1;
        deltaTotals.assertions.failed = 1;
        m_reporter->testCaseEnded(
            TestCaseStats(testInfo, deltaTotals, std::string(), std::string(), false));
        m_totals.testCases.failed++;
        testGroupEnded(std::string(), m_totals, 1, 1);
        m_reporter->testRunEnded(TestRunStats(m_runInfo, m_totals, false));
    }

    bool RunContext::lastAssertionPassed() { return m_lastAssertionPassed; }

    void RunContext::assertionPassed() {
        m_lastAssertionPassed = true;
        ++m_totals.assertions.passed;
        resetAssertionInfo();
        m_messageScopes.clear();
    }

    bool RunContext::aborting() const {
        return m_totals.assertions.failed >= static_cast<std::size_t>(m_config->abortAfter());
    }

    void RunContext::runCurrentTest(std::string& redirectedCout, std::string& redirectedCerr) {
        auto const& testCaseInfo = m_activeTestCase->getTestCaseInfo();
        SectionInfo testCaseSection(testCaseInfo.lineInfo, testCaseInfo.name);
        m_reporter->sectionStarting(testCaseSection);
        Counts prevAssertions = m_totals.assertions;
        double duration = 0;
        m_shouldReportUnexpected = true;
        m_lastAssertionInfo = {
            "TEST_CASE"_sr, testCaseInfo.lineInfo, StringRef(), ResultDisposition::Normal};

        seedRng(*m_config);

        Timer timer;
        CATCH_TRY {
            if (m_reporter->getPreferences().shouldRedirectStdOut) {
#if !defined(CATCH_CONFIG_EXPERIMENTAL_REDIRECT)
                RedirectedStreams redirectedStreams(redirectedCout, redirectedCerr);

                timer.start();
                invokeActiveTestCase();
#else
                OutputRedirect r(redirectedCout, redirectedCerr);
                timer.start();
                invokeActiveTestCase();
#endif
            } else {
                timer.start();
                invokeActiveTestCase();
            }
            duration = timer.getElapsedSeconds();
        }
        CATCH_CATCH_ANON(TestFailureException&) {
            // This just means the test was aborted due to failure
        }
        CATCH_CATCH_ALL {
            // Under CATCH_CONFIG_FAST_COMPILE, unexpected exceptions under
            // REQUIRE assertions are reported without translation at the point
            // of origin.
            if (m_shouldReportUnexpected) {
                AssertionReaction dummyReaction;
                handleUnexpectedInflightException(
                    m_lastAssertionInfo, translateActiveException(), dummyReaction);
            }
        }
        Counts assertions = m_totals.assertions - prevAssertions;
        bool missingAssertions = testForMissingAssertions(assertions);

        m_testCaseTracker->close();
        handleUnfinishedSections();
        m_messages.clear();
        m_messageScopes.clear();

        SectionStats testCaseSectionStats(testCaseSection, assertions, duration, missingAssertions);
        m_reporter->sectionEnded(testCaseSectionStats);
    }

    void RunContext::invokeActiveTestCase() {
        FatalConditionHandlerGuard _(&m_fatalConditionhandler);
        m_activeTestCase->invoke();
    }

    void RunContext::handleUnfinishedSections() {
        // If sections ended prematurely due to an exception we stored their
        // infos here so we can tear them down outside the unwind process.
        for (auto it = m_unfinishedSections.rbegin(), itEnd = m_unfinishedSections.rend();
             it != itEnd;
             ++it)
            sectionEnded(*it);
        m_unfinishedSections.clear();
    }

    void RunContext::handleExpr(AssertionInfo const& info,
                                ITransientExpression const& expr,
                                AssertionReaction& reaction) {
        m_reporter->assertionStarting(info);

        bool negated = isFalseTest(info.resultDisposition);
        bool result = expr.getResult() != negated;

        if (result) {
            if (!m_includeSuccessfulResults) {
                assertionPassed();
            } else {
                reportExpr(info, ResultWas::Ok, &expr, negated);
            }
        } else {
            reportExpr(info, ResultWas::ExpressionFailed, &expr, negated);
            populateReaction(reaction);
        }
    }
    void RunContext::reportExpr(AssertionInfo const& info,
                                ResultWas::OfType resultType,
                                ITransientExpression const* expr,
                                bool negated) {

        m_lastAssertionInfo = info;
        AssertionResultData data(resultType, LazyExpression(negated));

        AssertionResult assertionResult{info, data};
        assertionResult.m_resultData.lazyExpression.m_transientExpression = expr;

        assertionEnded(assertionResult);
    }

    void RunContext::handleMessage(AssertionInfo const& info,
                                   ResultWas::OfType resultType,
                                   StringRef const& message,
                                   AssertionReaction& reaction) {
        m_reporter->assertionStarting(info);

        m_lastAssertionInfo = info;

        AssertionResultData data(resultType, LazyExpression(false));
        data.message = static_cast<std::string>(message);
        AssertionResult assertionResult{m_lastAssertionInfo, data};
        assertionEnded(assertionResult);
        if (!assertionResult.isOk())
            populateReaction(reaction);
    }
    void RunContext::handleUnexpectedExceptionNotThrown(AssertionInfo const& info,
                                                        AssertionReaction& reaction) {
        handleNonExpr(info, Catch::ResultWas::DidntThrowException, reaction);
    }

    void RunContext::handleUnexpectedInflightException(AssertionInfo const& info,
                                                       std::string const& message,
                                                       AssertionReaction& reaction) {
        m_lastAssertionInfo = info;

        AssertionResultData data(ResultWas::ThrewException, LazyExpression(false));
        data.message = message;
        AssertionResult assertionResult{info, data};
        assertionEnded(assertionResult);
        populateReaction(reaction);
    }

    void RunContext::populateReaction(AssertionReaction& reaction) {
        reaction.shouldDebugBreak = m_config->shouldDebugBreak();
        reaction.shouldThrow =
            aborting() || (m_lastAssertionInfo.resultDisposition & ResultDisposition::Normal);
    }

    void RunContext::handleIncomplete(AssertionInfo const& info) {
        m_lastAssertionInfo = info;

        AssertionResultData data(ResultWas::ThrewException, LazyExpression(false));
        data.message = "Exception translation was disabled by CATCH_CONFIG_FAST_COMPILE";
        AssertionResult assertionResult{info, data};
        assertionEnded(assertionResult);
    }
    void RunContext::handleNonExpr(AssertionInfo const& info,
                                   ResultWas::OfType resultType,
                                   AssertionReaction& reaction) {
        m_lastAssertionInfo = info;

        AssertionResultData data(resultType, LazyExpression(false));
        AssertionResult assertionResult{info, data};
        assertionEnded(assertionResult);

        if (!assertionResult.isOk())
            populateReaction(reaction);
    }

    IResultCapture& getResultCapture() {
        if (auto* capture = getCurrentContext().getResultCapture())
            return *capture;
        else
            CATCH_INTERNAL_ERROR("No result capture instance");
    }

    void seedRng(IConfig const& config) {
        if (config.rngSeed() != 0) {
            std::srand(config.rngSeed());
            rng().seed(config.rngSeed());
        }
    }

    unsigned int rngSeed() { return getCurrentContext().getConfig()->rngSeed(); }

} // namespace Catch
// end catch_run_context.cpp
// start catch_section.cpp

namespace Catch {

    Section::Section(SectionInfo const& info) :
        m_info(info), m_sectionIncluded(getResultCapture().sectionStarted(m_info, m_assertions)) {
        m_timer.start();
    }

    Section::~Section() {
        if (m_sectionIncluded) {
            SectionEndInfo endInfo{m_info, m_assertions, m_timer.getElapsedSeconds()};
            if (uncaught_exceptions())
                getResultCapture().sectionEndedEarly(endInfo);
            else
                getResultCapture().sectionEnded(endInfo);
        }
    }

    // This indicates whether the section should be executed or not
    Section::operator bool() const { return m_sectionIncluded; }

} // end namespace Catch
// end catch_section.cpp
// start catch_section_info.cpp

namespace Catch {

    SectionInfo::SectionInfo(SourceLineInfo const& _lineInfo, std::string const& _name) :
        name(_name), lineInfo(_lineInfo) {}

} // end namespace Catch
// end catch_section_info.cpp
// start catch_session.cpp

// start catch_session.h

#include <memory>

namespace Catch {

    class Session : NonCopyable {
    public:
        Session();
        ~Session() override;

        void showHelp() const;
        void libIdentify();

        int applyCommandLine(int argc, char const* const* argv);
#if defined(CATCH_CONFIG_WCHAR) && defined(_WIN32) && defined(UNICODE)
        int applyCommandLine(int argc, wchar_t const* const* argv);
#endif

        void useConfigData(ConfigData const& configData);

        template <typename CharT> int run(int argc, CharT const* const argv[]) {
            if (m_startupExceptions)
                return 1;
            int returnCode = applyCommandLine(argc, argv);
            if (returnCode == 0)
                returnCode = run();
            return returnCode;
        }

        int run();

        clara::Parser const& cli() const;
        void cli(clara::Parser const& newParser);
        ConfigData& configData();
        Config& config();

    private:
        int runInternal();

        clara::Parser m_cli;
        ConfigData m_configData;
        std::shared_ptr<Config> m_config;
        bool m_startupExceptions = false;
    };

} // end namespace Catch

// end catch_session.h
// start catch_version.h

#include <iosfwd>

namespace Catch {

    // Versioning information
    struct Version {
        Version(Version const&) = delete;
        Version& operator=(Version const&) = delete;
        Version(unsigned int _majorVersion,
                unsigned int _minorVersion,
                unsigned int _patchNumber,
                char const* const _branchName,
                unsigned int _buildNumber);

        unsigned int const majorVersion;
        unsigned int const minorVersion;
        unsigned int const patchNumber;

        // buildNumber is only used if branchName is not null
        char const* const branchName;
        unsigned int const buildNumber;

        friend std::ostream& operator<<(std::ostream& os, Version const& version);
    };

    Version const& libraryVersion();
} // namespace Catch

// end catch_version.h
#include <cstdlib>
#include <iomanip>
#include <set>
#include <iterator>

namespace Catch {

    namespace {
        const int MaxExitCode = 255;

        IStreamingReporterPtr createReporter(std::string const& reporterName,
                                             IConfigPtr const& config) {
            auto reporter =
                Catch::getRegistryHub().getReporterRegistry().create(reporterName, config);
            CATCH_ENFORCE(reporter, "No reporter registered with name: '" << reporterName << "'");

            return reporter;
        }

        IStreamingReporterPtr makeReporter(std::shared_ptr<Config> const& config) {
            if (Catch::getRegistryHub().getReporterRegistry().getListeners().empty()) {
                return createReporter(config->getReporterName(), config);
            }

            // On older platforms, returning std::unique_ptr<ListeningReporter>
            // when the return type is std::unique_ptr<IStreamingReporter>
            // doesn't compile without a std::move call. However, this causes
            // a warning on newer platforms. Thus, we have to work around
            // it a bit and downcast the pointer manually.
            auto ret = std::unique_ptr<IStreamingReporter>(new ListeningReporter);
            auto& multi = static_cast<ListeningReporter&>(*ret);
            auto const& listeners = Catch::getRegistryHub().getReporterRegistry().getListeners();
            for (auto const& listener : listeners) {
                multi.addListener(listener->create(Catch::ReporterConfig(config)));
            }
            multi.addReporter(createReporter(config->getReporterName(), config));
            return ret;
        }

        class TestGroup {
        public:
            explicit TestGroup(std::shared_ptr<Config> const& config) :
                m_config{config}, m_context{config, makeReporter(config)} {
                auto const& allTestCases = getAllTestCasesSorted(*m_config);
                m_matches = m_config->testSpec().matchesByFilter(allTestCases, *m_config);
                auto const& invalidArgs = m_config->testSpec().getInvalidArgs();

                if (m_matches.empty() && invalidArgs.empty()) {
                    for (auto const& test : allTestCases)
                        if (!test.isHidden())
                            m_tests.emplace(&test);
                } else {
                    for (auto const& match : m_matches)
                        m_tests.insert(match.tests.begin(), match.tests.end());
                }
            }

            Totals execute() {
                auto const& invalidArgs = m_config->testSpec().getInvalidArgs();
                Totals totals;
                m_context.testGroupStarting(m_config->name(), 1, 1);
                for (auto const& testCase : m_tests) {
                    if (!m_context.aborting())
                        totals += m_context.runTest(*testCase);
                    else
                        m_context.reporter().skipTest(*testCase);
                }

                for (auto const& match : m_matches) {
                    if (match.tests.empty()) {
                        m_context.reporter().noMatchingTestCases(match.name);
                        totals.error = -1;
                    }
                }

                if (!invalidArgs.empty()) {
                    for (auto const& invalidArg : invalidArgs)
                        m_context.reporter().reportInvalidArguments(invalidArg);
                }

                m_context.testGroupEnded(m_config->name(), totals, 1, 1);
                return totals;
            }

        private:
            using Tests = std::set<TestCase const*>;

            std::shared_ptr<Config> m_config;
            RunContext m_context;
            Tests m_tests;
            TestSpec::Matches m_matches;
        };

        void applyFilenamesAsTags(Catch::IConfig const& config) {
            auto& tests = const_cast<std::vector<TestCase>&>(getAllTestCasesSorted(config));
            for (auto& testCase : tests) {
                auto tags = testCase.tags;

                std::string filename = testCase.lineInfo.file;
                auto lastSlash = filename.find_last_of("\\/");
                if (lastSlash != std::string::npos) {
                    filename.erase(0, lastSlash);
                    filename[0] = '#';
                }

                auto lastDot = filename.find_last_of('.');
                if (lastDot != std::string::npos) {
                    filename.erase(lastDot);
                }

                tags.push_back(std::move(filename));
                setTags(testCase, tags);
            }
        }

    } // namespace

    Session::Session() {
        static bool alreadyInstantiated = false;
        if (alreadyInstantiated) {
            CATCH_TRY {
                CATCH_INTERNAL_ERROR("Only one instance of Catch::Session can ever be used");
            }
            CATCH_CATCH_ALL { getMutableRegistryHub().registerStartupException(); }
        }

        // There cannot be exceptions at startup in no-exception mode.
#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
        const auto& exceptions = getRegistryHub().getStartupExceptionRegistry().getExceptions();
        if (!exceptions.empty()) {
            config();
            getCurrentMutableContext().setConfig(m_config);

            m_startupExceptions = true;
            Colour colourGuard(Colour::Red);
            Catch::cerr() << "Errors occurred during startup!" << '\n';
            // iterate over all exceptions and notify user
            for (const auto& ex_ptr : exceptions) {
                try {
                    std::rethrow_exception(ex_ptr);
                } catch (std::exception const& ex) {
                    Catch::cerr() << Column(ex.what()).indent(2) << '\n';
                }
            }
        }
#endif

        alreadyInstantiated = true;
        m_cli = makeCommandLineParser(m_configData);
    }
    Session::~Session() { Catch::cleanUp(); }

    void Session::showHelp() const {
        Catch::cout() << "\nCatch v" << libraryVersion() << "\n"
                      << m_cli << std::endl
                      << "For more detailed usage please see the project docs\n"
                      << std::endl;
    }
    void Session::libIdentify() {
        Catch::cout() << std::left << std::setw(16) << "description: "
                      << "A Catch2 test executable\n"
                      << std::left << std::setw(16) << "category: "
                      << "testframework\n"
                      << std::left << std::setw(16) << "framework: "
                      << "Catch Test\n"
                      << std::left << std::setw(16) << "version: " << libraryVersion() << std::endl;
    }

    int Session::applyCommandLine(int argc, char const* const* argv) {
        if (m_startupExceptions)
            return 1;

        auto result = m_cli.parse(clara::Args(argc, argv));
        if (!result) {
            config();
            getCurrentMutableContext().setConfig(m_config);
            Catch::cerr() << Colour(Colour::Red) << "\nError(s) in input:\n"
                          << Column(result.errorMessage()).indent(2) << "\n\n";
            Catch::cerr() << "Run with -? for usage\n" << std::endl;
            return MaxExitCode;
        }

        if (m_configData.showHelp)
            showHelp();
        if (m_configData.libIdentify)
            libIdentify();
        m_config.reset();
        return 0;
    }

#if defined(CATCH_CONFIG_WCHAR) && defined(_WIN32) && defined(UNICODE)
    int Session::applyCommandLine(int argc, wchar_t const* const* argv) {

        char** utf8Argv = new char*[argc];

        for (int i = 0; i < argc; ++i) {
            int bufSize =
                WideCharToMultiByte(CP_UTF8, 0, argv[i], -1, nullptr, 0, nullptr, nullptr);

            utf8Argv[i] = new char[bufSize];

            WideCharToMultiByte(CP_UTF8, 0, argv[i], -1, utf8Argv[i], bufSize, nullptr, nullptr);
        }

        int returnCode = applyCommandLine(argc, utf8Argv);

        for (int i = 0; i < argc; ++i)
            delete[] utf8Argv[i];

        delete[] utf8Argv;

        return returnCode;
    }
#endif

    void Session::useConfigData(ConfigData const& configData) {
        m_configData = configData;
        m_config.reset();
    }

    int Session::run() {
        if ((m_configData.waitForKeypress & WaitForKeypress::BeforeStart) != 0) {
            Catch::cout() << "...waiting for enter/ return before starting" << std::endl;
            static_cast<void>(std::getchar());
        }
        int exitCode = runInternal();
        if ((m_configData.waitForKeypress & WaitForKeypress::BeforeExit) != 0) {
            Catch::cout() << "...waiting for enter/ return before exiting, with code: " << exitCode
                          << std::endl;
            static_cast<void>(std::getchar());
        }
        return exitCode;
    }

    clara::Parser const& Session::cli() const { return m_cli; }
    void Session::cli(clara::Parser const& newParser) { m_cli = newParser; }
    ConfigData& Session::configData() { return m_configData; }
    Config& Session::config() {
        if (!m_config)
            m_config = std::make_shared<Config>(m_configData);
        return *m_config;
    }

    int Session::runInternal() {
        if (m_startupExceptions)
            return 1;

        if (m_configData.showHelp || m_configData.libIdentify) {
            return 0;
        }

        CATCH_TRY {
            config(); // Force config to be constructed

            seedRng(*m_config);

            if (m_configData.filenamesAsTags)
                applyFilenamesAsTags(*m_config);

            // Handle list request
            if (Option<std::size_t> listed = list(m_config))
                return static_cast<int>(*listed);

            TestGroup tests{m_config};
            auto const totals = tests.execute();

            if (m_config->warnAboutNoTests() && totals.error == -1)
                return 2;

            // Note that on unices only the lower 8 bits are usually used,
            // clamping the return value to 255 prevents false negative when
            // some multiple of 256 tests has failed
            return (std::min)(MaxExitCode,
                              (std::max)(totals.error, static_cast<int>(totals.assertions.failed)));
        }
#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
        catch (std::exception& ex) {
            Catch::cerr() << ex.what() << std::endl;
            return MaxExitCode;
        }
#endif
    }

} // end namespace Catch
// end catch_session.cpp
// start catch_singletons.cpp

#include <vector>

namespace Catch {

    namespace {
        static auto getSingletons() -> std::vector<ISingleton*>*& {
            static std::vector<ISingleton*>* g_singletons = nullptr;
            if (!g_singletons)
                g_singletons = new std::vector<ISingleton*>();
            return g_singletons;
        }
    } // namespace

    ISingleton::~ISingleton() {}

    void addSingleton(ISingleton* singleton) { getSingletons()->push_back(singleton); }
    void cleanupSingletons() {
        auto& singletons = getSingletons();
        for (auto singleton : *singletons)
            delete singleton;
        delete singletons;
        singletons = nullptr;
    }

} // namespace Catch
// end catch_singletons.cpp
// start catch_startup_exception_registry.cpp

#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
namespace Catch {
    void StartupExceptionRegistry::add(std::exception_ptr const& exception) noexcept {
        CATCH_TRY { m_exceptions.push_back(exception); }
        CATCH_CATCH_ALL {
            // If we run out of memory during start-up there's really not a lot
            // more we can do about it
            std::terminate();
        }
    }

    std::vector<std::exception_ptr> const&
    StartupExceptionRegistry::getExceptions() const noexcept {
        return m_exceptions;
    }

} // end namespace Catch
#endif
// end catch_startup_exception_registry.cpp
// start catch_stream.cpp

#include <cstdio>
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <memory>

namespace Catch {

    Catch::IStream::~IStream() = default;

    namespace Detail {
        namespace {
            template <typename WriterF, std::size_t bufferSize = 256>
            class StreamBufImpl : public std::streambuf {
                char data[bufferSize];
                WriterF m_writer;

            public:
                StreamBufImpl() { setp(data, data + sizeof(data)); }

                ~StreamBufImpl() noexcept { StreamBufImpl::sync(); }

            private:
                int overflow(int c) override {
                    sync();

                    if (c != EOF) {
                        if (pbase() == epptr())
                            m_writer(std::string(1, static_cast<char>(c)));
                        else
                            sputc(static_cast<char>(c));
                    }
                    return 0;
                }

                int sync() override {
                    if (pbase() != pptr()) {
                        m_writer(std::string(
                            pbase(), static_cast<std::string::size_type>(pptr() - pbase())));
                        setp(pbase(), epptr());
                    }
                    return 0;
                }
            };

            ///////////////////////////////////////////////////////////////////////////

            struct OutputDebugWriter {

                void operator()(std::string const& str) { writeToDebugConsole(str); }
            };

            ///////////////////////////////////////////////////////////////////////////

            class FileStream : public IStream {
                mutable std::ofstream m_ofs;

            public:
                FileStream(StringRef filename) {
                    m_ofs.open(filename.c_str());
                    CATCH_ENFORCE(!m_ofs.fail(), "Unable to open file: '" << filename << "'");
                }
                ~FileStream() override = default;

            public: // IStream
                std::ostream& stream() const override { return m_ofs; }
            };

            ///////////////////////////////////////////////////////////////////////////

            class CoutStream : public IStream {
                mutable std::ostream m_os;

            public:
                // Store the streambuf from cout up-front because
                // cout may get redirected when running tests
                CoutStream() : m_os(Catch::cout().rdbuf()) {}
                ~CoutStream() override = default;

            public: // IStream
                std::ostream& stream() const override { return m_os; }
            };

            ///////////////////////////////////////////////////////////////////////////

            class DebugOutStream : public IStream {
                std::unique_ptr<StreamBufImpl<OutputDebugWriter>> m_streamBuf;
                mutable std::ostream m_os;

            public:
                DebugOutStream() :
                    m_streamBuf(new StreamBufImpl<OutputDebugWriter>()), m_os(m_streamBuf.get()) {}

                ~DebugOutStream() override = default;

            public: // IStream
                std::ostream& stream() const override { return m_os; }
            };

        } // namespace
    }     // namespace Detail

    ///////////////////////////////////////////////////////////////////////////

    auto makeStream(StringRef const& filename) -> IStream const* {
        if (filename.empty())
            return new Detail::CoutStream();
        else if (filename[0] == '%') {
            if (filename == "%debug")
                return new Detail::DebugOutStream();
            else
                CATCH_ERROR("Unrecognised stream: '" << filename << "'");
        } else
            return new Detail::FileStream(filename);
    }

    // This class encapsulates the idea of a pool of ostringstreams that can be
    // reused.
    struct StringStreams {
        std::vector<std::unique_ptr<std::ostringstream>> m_streams;
        std::vector<std::size_t> m_unused;
        std::ostringstream m_referenceStream; // Used for copy state/ flags from

        auto add() -> std::size_t {
            if (m_unused.empty()) {
                m_streams.push_back(std::unique_ptr<std::ostringstream>(new std::ostringstream));
                return m_streams.size() - 1;
            } else {
                auto index = m_unused.back();
                m_unused.pop_back();
                return index;
            }
        }

        void release(std::size_t index) {
            m_streams[index]->copyfmt(m_referenceStream); // Restore initial flags and other state
            m_unused.push_back(index);
        }
    };

    ReusableStringStream::ReusableStringStream() :
        m_index(Singleton<StringStreams>::getMutable().add()),
        m_oss(Singleton<StringStreams>::getMutable().m_streams[m_index].get()) {}

    ReusableStringStream::~ReusableStringStream() {
        static_cast<std::ostringstream*>(m_oss)->str("");
        m_oss->clear();
        Singleton<StringStreams>::getMutable().release(m_index);
    }

    auto ReusableStringStream::str() const -> std::string {
        return static_cast<std::ostringstream*>(m_oss)->str();
    }

    ///////////////////////////////////////////////////////////////////////////

#ifndef CATCH_CONFIG_NOSTDOUT // If you #define this you must implement these
                              // functions
    std::ostream& cout() { return std::cout; }
    std::ostream& cerr() { return std::cerr; }
    std::ostream& clog() { return std::clog; }
#endif
} // namespace Catch
// end catch_stream.cpp
// start catch_string_manip.cpp

#include <algorithm>
#include <ostream>
#include <cstring>
#include <cctype>
#include <vector>

namespace Catch {

    namespace {
        char toLowerCh(char c) {
            return static_cast<char>(std::tolower(static_cast<unsigned char>(c)));
        }
    } // namespace

    bool startsWith(std::string const& s, std::string const& prefix) {
        return s.size() >= prefix.size() && std::equal(prefix.begin(), prefix.end(), s.begin());
    }
    bool startsWith(std::string const& s, char prefix) { return !s.empty() && s[0] == prefix; }
    bool endsWith(std::string const& s, std::string const& suffix) {
        return s.size() >= suffix.size() && std::equal(suffix.rbegin(), suffix.rend(), s.rbegin());
    }
    bool endsWith(std::string const& s, char suffix) {
        return !s.empty() && s[s.size() - 1] == suffix;
    }
    bool contains(std::string const& s, std::string const& infix) {
        return s.find(infix) != std::string::npos;
    }
    void toLowerInPlace(std::string& s) {
        std::transform(s.begin(), s.end(), s.begin(), toLowerCh);
    }
    std::string toLower(std::string const& s) {
        std::string lc = s;
        toLowerInPlace(lc);
        return lc;
    }
    std::string trim(std::string const& str) {
        static char const* whitespaceChars = "\n\r\t ";
        std::string::size_type start = str.find_first_not_of(whitespaceChars);
        std::string::size_type end = str.find_last_not_of(whitespaceChars);

        return start != std::string::npos ? str.substr(start, 1 + end - start) : std::string();
    }

    StringRef trim(StringRef ref) {
        const auto is_ws = [](char c) { return c == ' ' || c == '\t' || c == '\n' || c == '\r'; };
        size_t real_begin = 0;
        while (real_begin < ref.size() && is_ws(ref[real_begin])) {
            ++real_begin;
        }
        size_t real_end = ref.size();
        while (real_end > real_begin && is_ws(ref[real_end - 1])) {
            --real_end;
        }

        return ref.substr(real_begin, real_end - real_begin);
    }

    bool
    replaceInPlace(std::string& str, std::string const& replaceThis, std::string const& withThis) {
        bool replaced = false;
        std::size_t i = str.find(replaceThis);
        while (i != std::string::npos) {
            replaced = true;
            str = str.substr(0, i) + withThis + str.substr(i + replaceThis.size());
            if (i < str.size() - withThis.size())
                i = str.find(replaceThis, i + withThis.size());
            else
                i = std::string::npos;
        }
        return replaced;
    }

    std::vector<StringRef> splitStringRef(StringRef str, char delimiter) {
        std::vector<StringRef> subStrings;
        std::size_t start = 0;
        for (std::size_t pos = 0; pos < str.size(); ++pos) {
            if (str[pos] == delimiter) {
                if (pos - start > 1)
                    subStrings.push_back(str.substr(start, pos - start));
                start = pos + 1;
            }
        }
        if (start < str.size())
            subStrings.push_back(str.substr(start, str.size() - start));
        return subStrings;
    }

    pluralise::pluralise(std::size_t count, std::string const& label) :
        m_count(count), m_label(label) {}

    std::ostream& operator<<(std::ostream& os, pluralise const& pluraliser) {
        os << pluraliser.m_count << ' ' << pluraliser.m_label;
        if (pluraliser.m_count != 1)
            os << 's';
        return os;
    }

} // namespace Catch
// end catch_string_manip.cpp
// start catch_stringref.cpp

#include <algorithm>
#include <ostream>
#include <cstring>
#include <cstdint>

namespace Catch {
    StringRef::StringRef(char const* rawChars) noexcept :
        StringRef(rawChars, static_cast<StringRef::size_type>(std::strlen(rawChars))) {}

    auto StringRef::c_str() const -> char const* {
        CATCH_ENFORCE(isNullTerminated(),
                      "Called StringRef::c_str() on a non-null-terminated instance");
        return m_start;
    }
    auto StringRef::data() const noexcept -> char const* { return m_start; }

    auto StringRef::substr(size_type start, size_type size) const noexcept -> StringRef {
        if (start < m_size) {
            return StringRef(m_start + start, (std::min)(m_size - start, size));
        } else {
            return StringRef();
        }
    }
    auto StringRef::operator==(StringRef const& other) const noexcept -> bool {
        return m_size == other.m_size && (std::memcmp(m_start, other.m_start, m_size) == 0);
    }

    auto operator<<(std::ostream& os, StringRef const& str) -> std::ostream& {
        return os.write(str.data(), str.size());
    }

    auto operator+=(std::string& lhs, StringRef const& rhs) -> std::string& {
        lhs.append(rhs.data(), rhs.size());
        return lhs;
    }

} // namespace Catch
// end catch_stringref.cpp
// start catch_tag_alias.cpp

namespace Catch {
    TagAlias::TagAlias(std::string const& _tag, SourceLineInfo _lineInfo) :
        tag(_tag), lineInfo(_lineInfo) {}
} // namespace Catch
// end catch_tag_alias.cpp
// start catch_tag_alias_autoregistrar.cpp

namespace Catch {

    RegistrarForTagAliases::RegistrarForTagAliases(char const* alias,
                                                   char const* tag,
                                                   SourceLineInfo const& lineInfo) {
        CATCH_TRY { getMutableRegistryHub().registerTagAlias(alias, tag, lineInfo); }
        CATCH_CATCH_ALL {
            // Do not throw when constructing global objects, instead register
            // the exception to be processed later
            getMutableRegistryHub().registerStartupException();
        }
    }

} // namespace Catch
// end catch_tag_alias_autoregistrar.cpp
// start catch_tag_alias_registry.cpp

#include <sstream>

namespace Catch {

    TagAliasRegistry::~TagAliasRegistry() {}

    TagAlias const* TagAliasRegistry::find(std::string const& alias) const {
        auto it = m_registry.find(alias);
        if (it != m_registry.end())
            return &(it->second);
        else
            return nullptr;
    }

    std::string TagAliasRegistry::expandAliases(std::string const& unexpandedTestSpec) const {
        std::string expandedTestSpec = unexpandedTestSpec;
        for (auto const& registryKvp : m_registry) {
            std::size_t pos = expandedTestSpec.find(registryKvp.first);
            if (pos != std::string::npos) {
                expandedTestSpec = expandedTestSpec.substr(0, pos) + registryKvp.second.tag +
                                   expandedTestSpec.substr(pos + registryKvp.first.size());
            }
        }
        return expandedTestSpec;
    }

    void TagAliasRegistry::add(std::string const& alias,
                               std::string const& tag,
                               SourceLineInfo const& lineInfo) {
        CATCH_ENFORCE(startsWith(alias, "[@") && endsWith(alias, ']'),
                      "error: tag alias, '" << alias << "' is not of the form [@alias name].\n"
                                            << lineInfo);

        CATCH_ENFORCE(m_registry.insert(std::make_pair(alias, TagAlias(tag, lineInfo))).second,
                      "error: tag alias, '" << alias << "' already registered.\n"
                                            << "\tFirst seen at: " << find(alias)->lineInfo << "\n"
                                            << "\tRedefined at: " << lineInfo);
    }

    ITagAliasRegistry::~ITagAliasRegistry() {}

    ITagAliasRegistry const& ITagAliasRegistry::get() {
        return getRegistryHub().getTagAliasRegistry();
    }

} // end namespace Catch
// end catch_tag_alias_registry.cpp
// start catch_test_case_info.cpp

#include <cctype>
#include <exception>
#include <algorithm>
#include <sstream>

namespace Catch {

    namespace {
        TestCaseInfo::SpecialProperties parseSpecialTag(std::string const& tag) {
            if (startsWith(tag, '.') || tag == "!hide")
                return TestCaseInfo::IsHidden;
            else if (tag == "!throws")
                return TestCaseInfo::Throws;
            else if (tag == "!shouldfail")
                return TestCaseInfo::ShouldFail;
            else if (tag == "!mayfail")
                return TestCaseInfo::MayFail;
            else if (tag == "!nonportable")
                return TestCaseInfo::NonPortable;
            else if (tag == "!benchmark")
                return static_cast<TestCaseInfo::SpecialProperties>(TestCaseInfo::Benchmark |
                                                                    TestCaseInfo::IsHidden);
            else
                return TestCaseInfo::None;
        }
        bool isReservedTag(std::string const& tag) {
            return parseSpecialTag(tag) == TestCaseInfo::None && tag.size() > 0 &&
                   !std::isalnum(static_cast<unsigned char>(tag[0]));
        }
        void enforceNotReservedTag(std::string const& tag, SourceLineInfo const& _lineInfo) {
            CATCH_ENFORCE(!isReservedTag(tag),
                          "Tag name: [" << tag << "] is not allowed.\n"
                                        << "Tag names starting with non alphanumeric "
                                           "characters are reserved\n"
                                        << _lineInfo);
        }
    } // namespace

    TestCase makeTestCase(ITestInvoker* _testCase,
                          std::string const& _className,
                          NameAndTags const& nameAndTags,
                          SourceLineInfo const& _lineInfo) {
        bool isHidden = false;

        // Parse out tags
        std::vector<std::string> tags;
        std::string desc, tag;
        bool inTag = false;
        for (char c : nameAndTags.tags) {
            if (!inTag) {
                if (c == '[')
                    inTag = true;
                else
                    desc += c;
            } else {
                if (c == ']') {
                    TestCaseInfo::SpecialProperties prop = parseSpecialTag(tag);
                    if ((prop & TestCaseInfo::IsHidden) != 0)
                        isHidden = true;
                    else if (prop == TestCaseInfo::None)
                        enforceNotReservedTag(tag, _lineInfo);

                    // Merged hide tags like `[.approvals]` should be added as
                    // `[.][approvals]`. The `[.]` is added at later point, so
                    // we only strip the prefix
                    if (startsWith(tag, '.') && tag.size() > 1) {
                        tag.erase(0, 1);
                    }
                    tags.push_back(tag);
                    tag.clear();
                    inTag = false;
                } else
                    tag += c;
            }
        }
        if (isHidden) {
            // Add all "hidden" tags to make them behave identically
            tags.insert(tags.end(), {".", "!hide"});
        }

        TestCaseInfo info(
            static_cast<std::string>(nameAndTags.name), _className, desc, tags, _lineInfo);
        return TestCase(_testCase, std::move(info));
    }

    void setTags(TestCaseInfo& testCaseInfo, std::vector<std::string> tags) {
        std::sort(begin(tags), end(tags));
        tags.erase(std::unique(begin(tags), end(tags)), end(tags));
        testCaseInfo.lcaseTags.clear();

        for (auto const& tag : tags) {
            std::string lcaseTag = toLower(tag);
            testCaseInfo.properties = static_cast<TestCaseInfo::SpecialProperties>(
                testCaseInfo.properties | parseSpecialTag(lcaseTag));
            testCaseInfo.lcaseTags.push_back(lcaseTag);
        }
        testCaseInfo.tags = std::move(tags);
    }

    TestCaseInfo::TestCaseInfo(std::string const& _name,
                               std::string const& _className,
                               std::string const& _description,
                               std::vector<std::string> const& _tags,
                               SourceLineInfo const& _lineInfo) :
        name(_name),
        className(_className),
        description(_description),
        lineInfo(_lineInfo),
        properties(None) {
        setTags(*this, _tags);
    }

    bool TestCaseInfo::isHidden() const { return (properties & IsHidden) != 0; }
    bool TestCaseInfo::throws() const { return (properties & Throws) != 0; }
    bool TestCaseInfo::okToFail() const { return (properties & (ShouldFail | MayFail)) != 0; }
    bool TestCaseInfo::expectedToFail() const { return (properties & (ShouldFail)) != 0; }

    std::string TestCaseInfo::tagsAsString() const {
        std::string ret;
        // '[' and ']' per tag
        std::size_t full_size = 2 * tags.size();
        for (const auto& tag : tags) {
            full_size += tag.size();
        }
        ret.reserve(full_size);
        for (const auto& tag : tags) {
            ret.push_back('[');
            ret.append(tag);
            ret.push_back(']');
        }

        return ret;
    }

    TestCase::TestCase(ITestInvoker* testCase, TestCaseInfo&& info) :
        TestCaseInfo(std::move(info)), test(testCase) {}

    TestCase TestCase::withName(std::string const& _newName) const {
        TestCase other(*this);
        other.name = _newName;
        return other;
    }

    void TestCase::invoke() const { test->invoke(); }

    bool TestCase::operator==(TestCase const& other) const {
        return test.get() == other.test.get() && name == other.name && className == other.className;
    }

    bool TestCase::operator<(TestCase const& other) const { return name < other.name; }

    TestCaseInfo const& TestCase::getTestCaseInfo() const { return *this; }

} // end namespace Catch
// end catch_test_case_info.cpp
// start catch_test_case_registry_impl.cpp

#include <algorithm>
#include <sstream>

namespace Catch {

    namespace {
        struct TestHasher {
            using hash_t = uint64_t;

            explicit TestHasher(hash_t hashSuffix) : m_hashSuffix{hashSuffix} {}

            uint32_t operator()(TestCase const& t) const {
                // FNV-1a hash with multiplication fold.
                const hash_t prime = 1099511628211u;
                hash_t hash = 14695981039346656037u;
                for (const char c : t.name) {
                    hash ^= c;
                    hash *= prime;
                }
                hash ^= m_hashSuffix;
                hash *= prime;
                const uint32_t low{static_cast<uint32_t>(hash)};
                const uint32_t high{static_cast<uint32_t>(hash >> 32)};
                return low * high;
            }

        private:
            hash_t m_hashSuffix;
        };
    } // end unnamed namespace

    std::vector<TestCase> sortTests(IConfig const& config,
                                    std::vector<TestCase> const& unsortedTestCases) {
        switch (config.runOrder()) {
            case RunTests::InDeclarationOrder:
                // already in declaration order
                break;

            case RunTests::InLexicographicalOrder: {
                std::vector<TestCase> sorted = unsortedTestCases;
                std::sort(sorted.begin(), sorted.end());
                return sorted;
            }

            case RunTests::InRandomOrder: {
                seedRng(config);
                TestHasher h{config.rngSeed()};

                using hashedTest = std::pair<TestHasher::hash_t, TestCase const*>;
                std::vector<hashedTest> indexed_tests;
                indexed_tests.reserve(unsortedTestCases.size());

                for (auto const& testCase : unsortedTestCases) {
                    indexed_tests.emplace_back(h(testCase), &testCase);
                }

                std::sort(indexed_tests.begin(),
                          indexed_tests.end(),
                          [](hashedTest const& lhs, hashedTest const& rhs) {
                              if (lhs.first == rhs.first) {
                                  return lhs.second->name < rhs.second->name;
                              }
                              return lhs.first < rhs.first;
                          });

                std::vector<TestCase> sorted;
                sorted.reserve(indexed_tests.size());

                for (auto const& hashed : indexed_tests) {
                    sorted.emplace_back(*hashed.second);
                }

                return sorted;
            }
        }
        return unsortedTestCases;
    }

    bool isThrowSafe(TestCase const& testCase, IConfig const& config) {
        return !testCase.throws() || config.allowThrows();
    }

    bool matchTest(TestCase const& testCase, TestSpec const& testSpec, IConfig const& config) {
        return testSpec.matches(testCase) && isThrowSafe(testCase, config);
    }

    void enforceNoDuplicateTestCases(std::vector<TestCase> const& functions) {
        std::set<TestCase> seenFunctions;
        for (auto const& function : functions) {
            auto prev = seenFunctions.insert(function);
            CATCH_ENFORCE(prev.second,
                          "error: TEST_CASE( \"" << function.name << "\" ) already defined.\n"
                                                 << "\tFirst seen at "
                                                 << prev.first->getTestCaseInfo().lineInfo << "\n"
                                                 << "\tRedefined at "
                                                 << function.getTestCaseInfo().lineInfo);
        }
    }

    std::vector<TestCase> filterTests(std::vector<TestCase> const& testCases,
                                      TestSpec const& testSpec,
                                      IConfig const& config) {
        std::vector<TestCase> filtered;
        filtered.reserve(testCases.size());
        for (auto const& testCase : testCases) {
            if ((!testSpec.hasFilters() && !testCase.isHidden()) ||
                (testSpec.hasFilters() && matchTest(testCase, testSpec, config)))
            {
                filtered.push_back(testCase);
            }
        }
        return filtered;
    }
    std::vector<TestCase> const& getAllTestCasesSorted(IConfig const& config) {
        return getRegistryHub().getTestCaseRegistry().getAllTestsSorted(config);
    }

    void TestRegistry::registerTest(TestCase const& testCase) {
        std::string name = testCase.getTestCaseInfo().name;
        if (name.empty()) {
            ReusableStringStream rss;
            rss << "Anonymous test case " << ++m_unnamedCount;
            return registerTest(testCase.withName(rss.str()));
        }
        m_functions.push_back(testCase);
    }

    std::vector<TestCase> const& TestRegistry::getAllTests() const { return m_functions; }
    std::vector<TestCase> const& TestRegistry::getAllTestsSorted(IConfig const& config) const {
        if (m_sortedFunctions.empty())
            enforceNoDuplicateTestCases(m_functions);

        if (m_currentSortOrder != config.runOrder() || m_sortedFunctions.empty()) {
            m_sortedFunctions = sortTests(config, m_functions);
            m_currentSortOrder = config.runOrder();
        }
        return m_sortedFunctions;
    }

    ///////////////////////////////////////////////////////////////////////////
    TestInvokerAsFunction::TestInvokerAsFunction(void (*testAsFunction)()) noexcept :
        m_testAsFunction(testAsFunction) {}

    void TestInvokerAsFunction::invoke() const { m_testAsFunction(); }

    std::string extractClassName(StringRef const& classOrQualifiedMethodName) {
        std::string className(classOrQualifiedMethodName);
        if (startsWith(className, '&')) {
            std::size_t lastColons = className.rfind("::");
            std::size_t penultimateColons = className.rfind("::", lastColons - 1);
            if (penultimateColons == std::string::npos)
                penultimateColons = 1;
            className = className.substr(penultimateColons, lastColons - penultimateColons);
        }
        return className;
    }

} // end namespace Catch
// end catch_test_case_registry_impl.cpp
// start catch_test_case_tracker.cpp

#include <algorithm>
#include <cassert>
#include <stdexcept>
#include <memory>
#include <sstream>

#if defined(__clang__)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wexit-time-destructors"
#endif

namespace Catch {
    namespace TestCaseTracking {

        NameAndLocation::NameAndLocation(std::string const& _name,
                                         SourceLineInfo const& _location) :
            name(_name), location(_location) {}

        ITracker::~ITracker() = default;

        ITracker& TrackerContext::startRun() {
            m_rootTracker = std::make_shared<SectionTracker>(
                NameAndLocation("{root}", CATCH_INTERNAL_LINEINFO), *this, nullptr);
            m_currentTracker = nullptr;
            m_runState = Executing;
            return *m_rootTracker;
        }

        void TrackerContext::endRun() {
            m_rootTracker.reset();
            m_currentTracker = nullptr;
            m_runState = NotStarted;
        }

        void TrackerContext::startCycle() {
            m_currentTracker = m_rootTracker.get();
            m_runState = Executing;
        }
        void TrackerContext::completeCycle() { m_runState = CompletedCycle; }

        bool TrackerContext::completedCycle() const { return m_runState == CompletedCycle; }
        ITracker& TrackerContext::currentTracker() { return *m_currentTracker; }
        void TrackerContext::setCurrentTracker(ITracker* tracker) { m_currentTracker = tracker; }

        TrackerBase::TrackerBase(NameAndLocation const& nameAndLocation,
                                 TrackerContext& ctx,
                                 ITracker* parent) :
            ITracker(nameAndLocation), m_ctx(ctx), m_parent(parent) {}

        bool TrackerBase::isComplete() const {
            return m_runState == CompletedSuccessfully || m_runState == Failed;
        }
        bool TrackerBase::isSuccessfullyCompleted() const {
            return m_runState == CompletedSuccessfully;
        }
        bool TrackerBase::isOpen() const { return m_runState != NotStarted && !isComplete(); }
        bool TrackerBase::hasChildren() const { return !m_children.empty(); }

        void TrackerBase::addChild(ITrackerPtr const& child) { m_children.push_back(child); }

        ITrackerPtr TrackerBase::findChild(NameAndLocation const& nameAndLocation) {
            auto it = std::find_if(
                m_children.begin(),
                m_children.end(),
                [&nameAndLocation](ITrackerPtr const& tracker) {
                    return tracker->nameAndLocation().location == nameAndLocation.location &&
                           tracker->nameAndLocation().name == nameAndLocation.name;
                });
            return (it != m_children.end()) ? *it : nullptr;
        }
        ITracker& TrackerBase::parent() {
            assert(m_parent); // Should always be non-null except for root
            return *m_parent;
        }

        void TrackerBase::openChild() {
            if (m_runState != ExecutingChildren) {
                m_runState = ExecutingChildren;
                if (m_parent)
                    m_parent->openChild();
            }
        }

        bool TrackerBase::isSectionTracker() const { return false; }
        bool TrackerBase::isGeneratorTracker() const { return false; }

        void TrackerBase::open() {
            m_runState = Executing;
            moveToThis();
            if (m_parent)
                m_parent->openChild();
        }

        void TrackerBase::close() {

            // Close any still open children (e.g. generators)
            while (&m_ctx.currentTracker() != this)
                m_ctx.currentTracker().close();

            switch (m_runState) {
                case NeedsAnotherRun:
                    break;

                case Executing:
                    m_runState = CompletedSuccessfully;
                    break;
                case ExecutingChildren:
                    if (std::all_of(m_children.begin(), m_children.end(), [](ITrackerPtr const& t) {
                            return t->isComplete();
                        }))
                        m_runState = CompletedSuccessfully;
                    break;

                case NotStarted:
                case CompletedSuccessfully:
                case Failed:
                    CATCH_INTERNAL_ERROR("Illogical state: " << m_runState);

                default:
                    CATCH_INTERNAL_ERROR("Unknown state: " << m_runState);
            }
            moveToParent();
            m_ctx.completeCycle();
        }
        void TrackerBase::fail() {
            m_runState = Failed;
            if (m_parent)
                m_parent->markAsNeedingAnotherRun();
            moveToParent();
            m_ctx.completeCycle();
        }
        void TrackerBase::markAsNeedingAnotherRun() { m_runState = NeedsAnotherRun; }

        void TrackerBase::moveToParent() {
            assert(m_parent);
            m_ctx.setCurrentTracker(m_parent);
        }
        void TrackerBase::moveToThis() { m_ctx.setCurrentTracker(this); }

        SectionTracker::SectionTracker(NameAndLocation const& nameAndLocation,
                                       TrackerContext& ctx,
                                       ITracker* parent) :
            TrackerBase(nameAndLocation, ctx, parent), m_trimmed_name(trim(nameAndLocation.name)) {
            if (parent) {
                while (!parent->isSectionTracker())
                    parent = &parent->parent();

                SectionTracker& parentSection = static_cast<SectionTracker&>(*parent);
                addNextFilters(parentSection.m_filters);
            }
        }

        bool SectionTracker::isComplete() const {
            bool complete = true;

            if (m_filters.empty() || m_filters[0] == "" ||
                std::find(m_filters.begin(), m_filters.end(), m_trimmed_name) != m_filters.end())
            {
                complete = TrackerBase::isComplete();
            }
            return complete;
        }

        bool SectionTracker::isSectionTracker() const { return true; }

        SectionTracker& SectionTracker::acquire(TrackerContext& ctx,
                                                NameAndLocation const& nameAndLocation) {
            std::shared_ptr<SectionTracker> section;

            ITracker& currentTracker = ctx.currentTracker();
            if (ITrackerPtr childTracker = currentTracker.findChild(nameAndLocation)) {
                assert(childTracker);
                assert(childTracker->isSectionTracker());
                section = std::static_pointer_cast<SectionTracker>(childTracker);
            } else {
                section = std::make_shared<SectionTracker>(nameAndLocation, ctx, &currentTracker);
                currentTracker.addChild(section);
            }
            if (!ctx.completedCycle())
                section->tryOpen();
            return *section;
        }

        void SectionTracker::tryOpen() {
            if (!isComplete())
                open();
        }

        void SectionTracker::addInitialFilters(std::vector<std::string> const& filters) {
            if (!filters.empty()) {
                m_filters.reserve(m_filters.size() + filters.size() + 2);
                m_filters.emplace_back(""); // Root - should never be consulted
                m_filters.emplace_back(""); // Test Case - not a section filter
                m_filters.insert(m_filters.end(), filters.begin(), filters.end());
            }
        }
        void SectionTracker::addNextFilters(std::vector<std::string> const& filters) {
            if (filters.size() > 1)
                m_filters.insert(m_filters.end(), filters.begin() + 1, filters.end());
        }

        std::vector<std::string> const& SectionTracker::getFilters() const { return m_filters; }

        std::string const& SectionTracker::trimmedName() const { return m_trimmed_name; }

    } // namespace TestCaseTracking

    using TestCaseTracking::ITracker;
    using TestCaseTracking::SectionTracker;
    using TestCaseTracking::TrackerContext;

} // namespace Catch

#if defined(__clang__)
#pragma clang diagnostic pop
#endif
// end catch_test_case_tracker.cpp
// start catch_test_registry.cpp

namespace Catch {

    auto makeTestInvoker(void (*testAsFunction)()) noexcept -> ITestInvoker* {
        return new (std::nothrow) TestInvokerAsFunction(testAsFunction);
    }

    NameAndTags::NameAndTags(StringRef const& name_, StringRef const& tags_) noexcept :
        name(name_), tags(tags_) {}

    AutoReg::AutoReg(ITestInvoker* invoker,
                     SourceLineInfo const& lineInfo,
                     StringRef const& classOrMethod,
                     NameAndTags const& nameAndTags) noexcept {
        CATCH_TRY {
            getMutableRegistryHub().registerTest(
                makeTestCase(invoker, extractClassName(classOrMethod), nameAndTags, lineInfo));
        }
        CATCH_CATCH_ALL {
            // Do not throw when constructing global objects, instead register
            // the exception to be processed later
            getMutableRegistryHub().registerStartupException();
        }
    }

    AutoReg::~AutoReg() = default;
} // namespace Catch
// end catch_test_registry.cpp
// start catch_test_spec.cpp

#include <algorithm>
#include <string>
#include <vector>
#include <memory>

namespace Catch {

    TestSpec::Pattern::Pattern(std::string const& name) : m_name(name) {}

    TestSpec::Pattern::~Pattern() = default;

    std::string const& TestSpec::Pattern::name() const { return m_name; }

    TestSpec::NamePattern::NamePattern(std::string const& name, std::string const& filterString) :
        Pattern(filterString), m_wildcardPattern(toLower(name), CaseSensitive::No) {}

    bool TestSpec::NamePattern::matches(TestCaseInfo const& testCase) const {
        return m_wildcardPattern.matches(testCase.name);
    }

    TestSpec::TagPattern::TagPattern(std::string const& tag, std::string const& filterString) :
        Pattern(filterString), m_tag(toLower(tag)) {}

    bool TestSpec::TagPattern::matches(TestCaseInfo const& testCase) const {
        return std::find(begin(testCase.lcaseTags), end(testCase.lcaseTags), m_tag) !=
               end(testCase.lcaseTags);
    }

    TestSpec::ExcludedPattern::ExcludedPattern(PatternPtr const& underlyingPattern) :
        Pattern(underlyingPattern->name()), m_underlyingPattern(underlyingPattern) {}

    bool TestSpec::ExcludedPattern::matches(TestCaseInfo const& testCase) const {
        return !m_underlyingPattern->matches(testCase);
    }

    bool TestSpec::Filter::matches(TestCaseInfo const& testCase) const {
        return std::all_of(m_patterns.begin(), m_patterns.end(), [&](PatternPtr const& p) {
            return p->matches(testCase);
        });
    }

    std::string TestSpec::Filter::name() const {
        std::string name;
        for (auto const& p : m_patterns)
            name += p->name();
        return name;
    }

    bool TestSpec::hasFilters() const { return !m_filters.empty(); }

    bool TestSpec::matches(TestCaseInfo const& testCase) const {
        return std::any_of(m_filters.begin(), m_filters.end(), [&](Filter const& f) {
            return f.matches(testCase);
        });
    }

    TestSpec::Matches TestSpec::matchesByFilter(std::vector<TestCase> const& testCases,
                                                IConfig const& config) const {
        Matches matches(m_filters.size());
        std::transform(
            m_filters.begin(), m_filters.end(), matches.begin(), [&](Filter const& filter) {
                std::vector<TestCase const*> currentMatches;
                for (auto const& test : testCases)
                    if (isThrowSafe(test, config) && filter.matches(test))
                        currentMatches.emplace_back(&test);
                return FilterMatch{filter.name(), currentMatches};
            });
        return matches;
    }

    const TestSpec::vectorStrings& TestSpec::getInvalidArgs() const { return (m_invalidArgs); }

} // namespace Catch
// end catch_test_spec.cpp
// start catch_test_spec_parser.cpp

namespace Catch {

    TestSpecParser::TestSpecParser(ITagAliasRegistry const& tagAliases) :
        m_tagAliases(&tagAliases) {}

    TestSpecParser& TestSpecParser::parse(std::string const& arg) {
        m_mode = None;
        m_exclusion = false;
        m_arg = m_tagAliases->expandAliases(arg);
        m_escapeChars.clear();
        m_substring.reserve(m_arg.size());
        m_patternName.reserve(m_arg.size());
        m_realPatternPos = 0;

        for (m_pos = 0; m_pos < m_arg.size(); ++m_pos)
            // if visitChar fails
            if (!visitChar(m_arg[m_pos])) {
                m_testSpec.m_invalidArgs.push_back(arg);
                break;
            }
        endMode();
        return *this;
    }
    TestSpec TestSpecParser::testSpec() {
        addFilter();
        return m_testSpec;
    }
    bool TestSpecParser::visitChar(char c) {
        if ((m_mode != EscapedName) && (c == '\\')) {
            escape();
            addCharToPattern(c);
            return true;
        } else if ((m_mode != EscapedName) && (c == ',')) {
            return separate();
        }

        switch (m_mode) {
            case None:
                if (processNoneChar(c))
                    return true;
                break;
            case Name:
                processNameChar(c);
                break;
            case EscapedName:
                endMode();
                addCharToPattern(c);
                return true;
            default:
            case Tag:
            case QuotedName:
                if (processOtherChar(c))
                    return true;
                break;
        }

        m_substring += c;
        if (!isControlChar(c)) {
            m_patternName += c;
            m_realPatternPos++;
        }
        return true;
    }
    // Two of the processing methods return true to signal the caller to return
    // without adding the given character to the current pattern strings
    bool TestSpecParser::processNoneChar(char c) {
        switch (c) {
            case ' ':
                return true;
            case '~':
                m_exclusion = true;
                return false;
            case '[':
                startNewMode(Tag);
                return false;
            case '"':
                startNewMode(QuotedName);
                return false;
            default:
                startNewMode(Name);
                return false;
        }
    }
    void TestSpecParser::processNameChar(char c) {
        if (c == '[') {
            if (m_substring == "exclude:")
                m_exclusion = true;
            else
                endMode();
            startNewMode(Tag);
        }
    }
    bool TestSpecParser::processOtherChar(char c) {
        if (!isControlChar(c))
            return false;
        m_substring += c;
        endMode();
        return true;
    }
    void TestSpecParser::startNewMode(Mode mode) { m_mode = mode; }
    void TestSpecParser::endMode() {
        switch (m_mode) {
            case Name:
            case QuotedName:
                return addNamePattern();
            case Tag:
                return addTagPattern();
            case EscapedName:
                revertBackToLastMode();
                return;
            case None:
            default:
                return startNewMode(None);
        }
    }
    void TestSpecParser::escape() {
        saveLastMode();
        m_mode = EscapedName;
        m_escapeChars.push_back(m_realPatternPos);
    }
    bool TestSpecParser::isControlChar(char c) const {
        switch (m_mode) {
            default:
                return false;
            case None:
                return c == '~';
            case Name:
                return c == '[';
            case EscapedName:
                return true;
            case QuotedName:
                return c == '"';
            case Tag:
                return c == '[' || c == ']';
        }
    }

    void TestSpecParser::addFilter() {
        if (!m_currentFilter.m_patterns.empty()) {
            m_testSpec.m_filters.push_back(m_currentFilter);
            m_currentFilter = TestSpec::Filter();
        }
    }

    void TestSpecParser::saveLastMode() { lastMode = m_mode; }

    void TestSpecParser::revertBackToLastMode() { m_mode = lastMode; }

    bool TestSpecParser::separate() {
        if ((m_mode == QuotedName) || (m_mode == Tag)) {
            // invalid argument, signal failure to previous scope.
            m_mode = None;
            m_pos = m_arg.size();
            m_substring.clear();
            m_patternName.clear();
            m_realPatternPos = 0;
            return false;
        }
        endMode();
        addFilter();
        return true; // success
    }

    std::string TestSpecParser::preprocessPattern() {
        std::string token = m_patternName;
        for (std::size_t i = 0; i < m_escapeChars.size(); ++i)
            token = token.substr(0, m_escapeChars[i] - i) + token.substr(m_escapeChars[i] - i + 1);
        m_escapeChars.clear();
        if (startsWith(token, "exclude:")) {
            m_exclusion = true;
            token = token.substr(8);
        }

        m_patternName.clear();
        m_realPatternPos = 0;

        return token;
    }

    void TestSpecParser::addNamePattern() {
        auto token = preprocessPattern();

        if (!token.empty()) {
            TestSpec::PatternPtr pattern =
                std::make_shared<TestSpec::NamePattern>(token, m_substring);
            if (m_exclusion)
                pattern = std::make_shared<TestSpec::ExcludedPattern>(pattern);
            m_currentFilter.m_patterns.push_back(pattern);
        }
        m_substring.clear();
        m_exclusion = false;
        m_mode = None;
    }

    void TestSpecParser::addTagPattern() {
        auto token = preprocessPattern();

        if (!token.empty()) {
            // If the tag pattern is the "hide and tag" shorthand (e.g. [.foo])
            // we have to create a separate hide tag and shorten the real one
            if (token.size() > 1 && token[0] == '.') {
                token.erase(token.begin());
                TestSpec::PatternPtr pattern =
                    std::make_shared<TestSpec::TagPattern>(".", m_substring);
                if (m_exclusion) {
                    pattern = std::make_shared<TestSpec::ExcludedPattern>(pattern);
                }
                m_currentFilter.m_patterns.push_back(pattern);
            }

            TestSpec::PatternPtr pattern =
                std::make_shared<TestSpec::TagPattern>(token, m_substring);

            if (m_exclusion) {
                pattern = std::make_shared<TestSpec::ExcludedPattern>(pattern);
            }
            m_currentFilter.m_patterns.push_back(pattern);
        }
        m_substring.clear();
        m_exclusion = false;
        m_mode = None;
    }

    TestSpec parseTestSpec(std::string const& arg) {
        return TestSpecParser(ITagAliasRegistry::get()).parse(arg).testSpec();
    }

} // namespace Catch
// end catch_test_spec_parser.cpp
// start catch_timer.cpp

#include <chrono>

static const uint64_t nanosecondsInSecond = 1000000000;

namespace Catch {

    auto getCurrentNanosecondsSinceEpoch() -> uint64_t {
        return std::chrono::duration_cast<std::chrono::nanoseconds>(
                   std::chrono::high_resolution_clock::now().time_since_epoch())
            .count();
    }

    namespace {
        auto estimateClockResolution() -> uint64_t {
            uint64_t sum = 0;
            static const uint64_t iterations = 1000000;

            auto startTime = getCurrentNanosecondsSinceEpoch();

            for (std::size_t i = 0; i < iterations; ++i) {

                uint64_t ticks;
                uint64_t baseTicks = getCurrentNanosecondsSinceEpoch();
                do {
                    ticks = getCurrentNanosecondsSinceEpoch();
                } while (ticks == baseTicks);

                auto delta = ticks - baseTicks;
                sum += delta;

                // If we have been calibrating for over 3 seconds -- the clock
                // is terrible and we should move on.
                // TBD: How to signal that the measured resolution is probably
                // wrong?
                if (ticks > startTime + 3 * nanosecondsInSecond) {
                    return sum / (i + 1u);
                }
            }

            // We're just taking the mean, here. To do better we could take the
            // std. dev and exclude outliers
            // - and potentially do more iterations if there's a high variance.
            return sum / iterations;
        }
    } // namespace
    auto getEstimatedClockResolution() -> uint64_t {
        static auto s_resolution = estimateClockResolution();
        return s_resolution;
    }

    void Timer::start() { m_nanoseconds = getCurrentNanosecondsSinceEpoch(); }
    auto Timer::getElapsedNanoseconds() const -> uint64_t {
        return getCurrentNanosecondsSinceEpoch() - m_nanoseconds;
    }
    auto Timer::getElapsedMicroseconds() const -> uint64_t {
        return getElapsedNanoseconds() / 1000;
    }
    auto Timer::getElapsedMilliseconds() const -> unsigned int {
        return static_cast<unsigned int>(getElapsedMicroseconds() / 1000);
    }
    auto Timer::getElapsedSeconds() const -> double { return getElapsedMicroseconds() / 1000000.0; }

} // namespace Catch
// end catch_timer.cpp
// start catch_tostring.cpp

#if defined(__clang__)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wexit-time-destructors"
#pragma clang diagnostic ignored "-Wglobal-constructors"
#endif

// Enable specific decls locally
#if !defined(CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER)
#define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER
#endif

#include <cmath>
#include <iomanip>

namespace Catch {

    namespace Detail {

        const std::string unprintableString = "{?}";

        namespace {
            const int hexThreshold = 255;

            struct Endianness {
                enum Arch { Big, Little };

                static Arch which() {
                    int one = 1;
                    // If the lowest byte we read is non-zero, we can assume
                    // that little endian format is used.
                    auto value = *reinterpret_cast<char*>(&one);
                    return value ? Little : Big;
                }
            };
        } // namespace

        std::string rawMemoryToString(const void* object, std::size_t size) {
            // Reverse order for little endian architectures
            int i = 0, end = static_cast<int>(size), inc = 1;
            if (Endianness::which() == Endianness::Little) {
                i = end - 1;
                end = inc = -1;
            }

            unsigned char const* bytes = static_cast<unsigned char const*>(object);
            ReusableStringStream rss;
            rss << "0x" << std::setfill('0') << std::hex;
            for (; i != end; i += inc)
                rss << std::setw(2) << static_cast<unsigned>(bytes[i]);
            return rss.str();
        }
    } // namespace Detail

    template <typename T> std::string fpToString(T value, int precision) {
        if (Catch::isnan(value)) {
            return "nan";
        }

        ReusableStringStream rss;
        rss << std::setprecision(precision) << std::fixed << value;
        std::string d = rss.str();
        std::size_t i = d.find_last_not_of('0');
        if (i != std::string::npos && i != d.size() - 1) {
            if (d[i] == '.')
                i++;
            d = d.substr(0, i + 1);
        }
        return d;
    }

    //// ======================================================= ////
    //
    //   Out-of-line defs for full specialization of StringMaker
    //
    //// ======================================================= ////

    std::string StringMaker<std::string>::convert(const std::string& str) {
        if (!getCurrentContext().getConfig()->showInvisibles()) {
            return '"' + str + '"';
        }

        std::string s("\"");
        for (char c : str) {
            switch (c) {
                case '\n':
                    s.append("\\n");
                    break;
                case '\t':
                    s.append("\\t");
                    break;
                default:
                    s.push_back(c);
                    break;
            }
        }
        s.append("\"");
        return s;
    }

#ifdef CATCH_CONFIG_CPP17_STRING_VIEW
    std::string StringMaker<std::string_view>::convert(std::string_view str) {
        return ::Catch::Detail::stringify(std::string{str});
    }
#endif

    std::string StringMaker<char const*>::convert(char const* str) {
        if (str) {
            return ::Catch::Detail::stringify(std::string{str});
        } else {
            return {"{null string}"};
        }
    }
    std::string StringMaker<char*>::convert(char* str) {
        if (str) {
            return ::Catch::Detail::stringify(std::string{str});
        } else {
            return {"{null string}"};
        }
    }

#ifdef CATCH_CONFIG_WCHAR
    std::string StringMaker<std::wstring>::convert(const std::wstring& wstr) {
        std::string s;
        s.reserve(wstr.size());
        for (auto c : wstr) {
            s += (c <= 0xff) ? static_cast<char>(c) : '?';
        }
        return ::Catch::Detail::stringify(s);
    }

#ifdef CATCH_CONFIG_CPP17_STRING_VIEW
    std::string StringMaker<std::wstring_view>::convert(std::wstring_view str) {
        return StringMaker<std::wstring>::convert(std::wstring(str));
    }
#endif

    std::string StringMaker<wchar_t const*>::convert(wchar_t const* str) {
        if (str) {
            return ::Catch::Detail::stringify(std::wstring{str});
        } else {
            return {"{null string}"};
        }
    }
    std::string StringMaker<wchar_t*>::convert(wchar_t* str) {
        if (str) {
            return ::Catch::Detail::stringify(std::wstring{str});
        } else {
            return {"{null string}"};
        }
    }
#endif

#if defined(CATCH_CONFIG_CPP17_BYTE)
#include <cstddef>
    std::string StringMaker<std::byte>::convert(std::byte value) {
        return ::Catch::Detail::stringify(std::to_integer<unsigned long long>(value));
    }
#endif // defined(CATCH_CONFIG_CPP17_BYTE)

    std::string StringMaker<int>::convert(int value) {
        return ::Catch::Detail::stringify(static_cast<long long>(value));
    }
    std::string StringMaker<long>::convert(long value) {
        return ::Catch::Detail::stringify(static_cast<long long>(value));
    }
    std::string StringMaker<long long>::convert(long long value) {
        ReusableStringStream rss;
        rss << value;
        if (value > Detail::hexThreshold) {
            rss << " (0x" << std::hex << value << ')';
        }
        return rss.str();
    }

    std::string StringMaker<unsigned int>::convert(unsigned int value) {
        return ::Catch::Detail::stringify(static_cast<unsigned long long>(value));
    }
    std::string StringMaker<unsigned long>::convert(unsigned long value) {
        return ::Catch::Detail::stringify(static_cast<unsigned long long>(value));
    }
    std::string StringMaker<unsigned long long>::convert(unsigned long long value) {
        ReusableStringStream rss;
        rss << value;
        if (value > Detail::hexThreshold) {
            rss << " (0x" << std::hex << value << ')';
        }
        return rss.str();
    }

    std::string StringMaker<bool>::convert(bool b) { return b ? "true" : "false"; }

    std::string StringMaker<signed char>::convert(signed char value) {
        if (value == '\r') {
            return "'\\r'";
        } else if (value == '\f') {
            return "'\\f'";
        } else if (value == '\n') {
            return "'\\n'";
        } else if (value == '\t') {
            return "'\\t'";
        } else if ('\0' <= value && value < ' ') {
            return ::Catch::Detail::stringify(static_cast<unsigned int>(value));
        } else {
            char chstr[] = "' '";
            chstr[1] = value;
            return chstr;
        }
    }
    std::string StringMaker<char>::convert(char c) {
        return ::Catch::Detail::stringify(static_cast<signed char>(c));
    }
    std::string StringMaker<unsigned char>::convert(unsigned char c) {
        return ::Catch::Detail::stringify(static_cast<char>(c));
    }

    std::string StringMaker<std::nullptr_t>::convert(std::nullptr_t) { return "nullptr"; }

    int StringMaker<float>::precision = 5;

    std::string StringMaker<float>::convert(float value) {
        return fpToString(value, precision) + 'f';
    }

    int StringMaker<double>::precision = 10;

    std::string StringMaker<double>::convert(double value) { return fpToString(value, precision); }

    std::string ratio_string<std::atto>::symbol() { return "a"; }
    std::string ratio_string<std::femto>::symbol() { return "f"; }
    std::string ratio_string<std::pico>::symbol() { return "p"; }
    std::string ratio_string<std::nano>::symbol() { return "n"; }
    std::string ratio_string<std::micro>::symbol() { return "u"; }
    std::string ratio_string<std::milli>::symbol() { return "m"; }

} // end namespace Catch

#if defined(__clang__)
#pragma clang diagnostic pop
#endif

// end catch_tostring.cpp
// start catch_totals.cpp

namespace Catch {

    Counts Counts::operator-(Counts const& other) const {
        Counts diff;
        diff.passed = passed - other.passed;
        diff.failed = failed - other.failed;
        diff.failedButOk = failedButOk - other.failedButOk;
        return diff;
    }

    Counts& Counts::operator+=(Counts const& other) {
        passed += other.passed;
        failed += other.failed;
        failedButOk += other.failedButOk;
        return *this;
    }

    std::size_t Counts::total() const { return passed + failed + failedButOk; }
    bool Counts::allPassed() const { return failed == 0 && failedButOk == 0; }
    bool Counts::allOk() const { return failed == 0; }

    Totals Totals::operator-(Totals const& other) const {
        Totals diff;
        diff.assertions = assertions - other.assertions;
        diff.testCases = testCases - other.testCases;
        return diff;
    }

    Totals& Totals::operator+=(Totals const& other) {
        assertions += other.assertions;
        testCases += other.testCases;
        return *this;
    }

    Totals Totals::delta(Totals const& prevTotals) const {
        Totals diff = *this - prevTotals;
        if (diff.assertions.failed > 0)
            ++diff.testCases.failed;
        else if (diff.assertions.failedButOk > 0)
            ++diff.testCases.failedButOk;
        else
            ++diff.testCases.passed;
        return diff;
    }

} // namespace Catch
// end catch_totals.cpp
// start catch_uncaught_exceptions.cpp

// start catch_config_uncaught_exceptions.hpp

//              Copyright Catch2 Authors
// Distributed under the Boost Software License, Version 1.0.
//   (See accompanying file LICENSE_1_0.txt or copy at
//        https://www.boost.org/LICENSE_1_0.txt)

// SPDX-License-Identifier: BSL-1.0

#ifndef CATCH_CONFIG_UNCAUGHT_EXCEPTIONS_HPP
#define CATCH_CONFIG_UNCAUGHT_EXCEPTIONS_HPP

#if defined(_MSC_VER)
#if _MSC_VER >= 1900 // Visual Studio 2015 or newer
#define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS
#endif
#endif

#include <exception>

#if defined(__cpp_lib_uncaught_exceptions) &&                                                      \
    !defined(CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS)

#define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS
#endif // __cpp_lib_uncaught_exceptions

#if defined(CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) &&                                    \
    !defined(CATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS) &&                                         \
    !defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS)

#define CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS
#endif

#endif // CATCH_CONFIG_UNCAUGHT_EXCEPTIONS_HPP
// end catch_config_uncaught_exceptions.hpp
#include <exception>

namespace Catch {
    bool uncaught_exceptions() {
#if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
        return false;
#elif defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS)
        return std::uncaught_exceptions() > 0;
#else
        return std::uncaught_exception();
#endif
    }
} // end namespace Catch
// end catch_uncaught_exceptions.cpp
// start catch_version.cpp

#include <ostream>

namespace Catch {

    Version::Version(unsigned int _majorVersion,
                     unsigned int _minorVersion,
                     unsigned int _patchNumber,
                     char const* const _branchName,
                     unsigned int _buildNumber) :
        majorVersion(_majorVersion),
        minorVersion(_minorVersion),
        patchNumber(_patchNumber),
        branchName(_branchName),
        buildNumber(_buildNumber) {}

    std::ostream& operator<<(std::ostream& os, Version const& version) {
        os << version.majorVersion << '.' << version.minorVersion << '.' << version.patchNumber;
        // branchName is never null -> 0th char is \0 if it is empty
        if (version.branchName[0]) {
            os << '-' << version.branchName << '.' << version.buildNumber;
        }
        return os;
    }

    Version const& libraryVersion() {
        static Version version(2, 13, 7, "", 0);
        return version;
    }

} // namespace Catch
// end catch_version.cpp
// start catch_wildcard_pattern.cpp

namespace Catch {

    WildcardPattern::WildcardPattern(std::string const& pattern,
                                     CaseSensitive::Choice caseSensitivity) :
        m_caseSensitivity(caseSensitivity), m_pattern(normaliseString(pattern)) {
        if (startsWith(m_pattern, '*')) {
            m_pattern = m_pattern.substr(1);
            m_wildcard = WildcardAtStart;
        }
        if (endsWith(m_pattern, '*')) {
            m_pattern = m_pattern.substr(0, m_pattern.size() - 1);
            m_wildcard = static_cast<WildcardPosition>(m_wildcard | WildcardAtEnd);
        }
    }

    bool WildcardPattern::matches(std::string const& str) const {
        switch (m_wildcard) {
            case NoWildcard:
                return m_pattern == normaliseString(str);
            case WildcardAtStart:
                return endsWith(normaliseString(str), m_pattern);
            case WildcardAtEnd:
                return startsWith(normaliseString(str), m_pattern);
            case WildcardAtBothEnds:
                return contains(normaliseString(str), m_pattern);
            default:
                CATCH_INTERNAL_ERROR("Unknown enum");
        }
    }

    std::string WildcardPattern::normaliseString(std::string const& str) const {
        return trim(m_caseSensitivity == CaseSensitive::No ? toLower(str) : str);
    }
} // namespace Catch
// end catch_wildcard_pattern.cpp
// start catch_xmlwriter.cpp

#include <iomanip>
#include <type_traits>

namespace Catch {

    namespace {

        size_t trailingBytes(unsigned char c) {
            if ((c & 0xE0) == 0xC0) {
                return 2;
            }
            if ((c & 0xF0) == 0xE0) {
                return 3;
            }
            if ((c & 0xF8) == 0xF0) {
                return 4;
            }
            CATCH_INTERNAL_ERROR("Invalid multibyte utf-8 start byte encountered");
        }

        uint32_t headerValue(unsigned char c) {
            if ((c & 0xE0) == 0xC0) {
                return c & 0x1F;
            }
            if ((c & 0xF0) == 0xE0) {
                return c & 0x0F;
            }
            if ((c & 0xF8) == 0xF0) {
                return c & 0x07;
            }
            CATCH_INTERNAL_ERROR("Invalid multibyte utf-8 start byte encountered");
        }

        void hexEscapeChar(std::ostream& os, unsigned char c) {
            std::ios_base::fmtflags f(os.flags());
            os << "\\x" << std::uppercase << std::hex << std::setfill('0') << std::setw(2)
               << static_cast<int>(c);
            os.flags(f);
        }

        bool shouldNewline(XmlFormatting fmt) {
            return !!(static_cast<std::underlying_type<XmlFormatting>::type>(
                fmt & XmlFormatting::Newline));
        }

        bool shouldIndent(XmlFormatting fmt) {
            return !!(static_cast<std::underlying_type<XmlFormatting>::type>(
                fmt & XmlFormatting::Indent));
        }

    } // anonymous namespace

    XmlFormatting operator|(XmlFormatting lhs, XmlFormatting rhs) {
        return static_cast<XmlFormatting>(
            static_cast<std::underlying_type<XmlFormatting>::type>(lhs) |
            static_cast<std::underlying_type<XmlFormatting>::type>(rhs));
    }

    XmlFormatting operator&(XmlFormatting lhs, XmlFormatting rhs) {
        return static_cast<XmlFormatting>(
            static_cast<std::underlying_type<XmlFormatting>::type>(lhs) &
            static_cast<std::underlying_type<XmlFormatting>::type>(rhs));
    }

    XmlEncode::XmlEncode(std::string const& str, ForWhat forWhat) :
        m_str(str), m_forWhat(forWhat) {}

    void XmlEncode::encodeTo(std::ostream& os) const {
        // Apostrophe escaping not necessary if we always use " to write
        // attributes (see: http://www.w3.org/TR/xml/#syntax)

        for (std::size_t idx = 0; idx < m_str.size(); ++idx) {
            unsigned char c = m_str[idx];
            switch (c) {
                case '<':
                    os << "&lt;";
                    break;
                case '&':
                    os << "&amp;";
                    break;

                case '>':
                    // See: http://www.w3.org/TR/xml/#syntax
                    if (idx > 2 && m_str[idx - 1] == ']' && m_str[idx - 2] == ']')
                        os << "&gt;";
                    else
                        os << c;
                    break;

                case '\"':
                    if (m_forWhat == ForAttributes)
                        os << "&quot;";
                    else
                        os << c;
                    break;

                default:
                    // Check for control characters and invalid utf-8

                    // Escape control characters in standard ascii
                    // see
                    // http://stackoverflow.com/questions/404107/why-are-control-characters-illegal-in-xml-1-0
                    if (c < 0x09 || (c > 0x0D && c < 0x20) || c == 0x7F) {
                        hexEscapeChar(os, c);
                        break;
                    }

                    // Plain ASCII: Write it to stream
                    if (c < 0x7F) {
                        os << c;
                        break;
                    }

                    // UTF-8 territory
                    // Check if the encoding is valid and if it is not, hex
                    // escape bytes. Important: We do not check the exact
                    // decoded values for validity, only the encoding format
                    // First check that this bytes is a valid lead byte:
                    // This means that it is not encoded as 1111 1XXX
                    // Or as 10XX XXXX
                    if (c < 0xC0 || c >= 0xF8) {
                        hexEscapeChar(os, c);
                        break;
                    }

                    auto encBytes = trailingBytes(c);
                    // Are there enough bytes left to avoid accessing
                    // out-of-bounds memory?
                    if (idx + encBytes - 1 >= m_str.size()) {
                        hexEscapeChar(os, c);
                        break;
                    }
                    // The header is valid, check data
                    // The next encBytes bytes must together be a valid utf-8
                    // This means: bitpattern 10XX XXXX and the extracted value
                    // is sane (ish)
                    bool valid = true;
                    uint32_t value = headerValue(c);
                    for (std::size_t n = 1; n < encBytes; ++n) {
                        unsigned char nc = m_str[idx + n];
                        valid &= ((nc & 0xC0) == 0x80);
                        value = (value << 6) | (nc & 0x3F);
                    }

                    if (
                        // Wrong bit pattern of following bytes
                        (!valid) ||
                        // Overlong encodings
                        (value < 0x80) || (0x80 <= value && value < 0x800 && encBytes > 2) ||
                        (0x800 < value && value < 0x10000 && encBytes > 3) ||
                        // Encoded value out of range
                        (value >= 0x110000))
                    {
                        hexEscapeChar(os, c);
                        break;
                    }

                    // If we got here, this is in fact a valid(ish) utf-8
                    // sequence
                    for (std::size_t n = 0; n < encBytes; ++n) {
                        os << m_str[idx + n];
                    }
                    idx += encBytes - 1;
                    break;
            }
        }
    }

    std::ostream& operator<<(std::ostream& os, XmlEncode const& xmlEncode) {
        xmlEncode.encodeTo(os);
        return os;
    }

    XmlWriter::ScopedElement::ScopedElement(XmlWriter* writer, XmlFormatting fmt) :
        m_writer(writer), m_fmt(fmt) {}

    XmlWriter::ScopedElement::ScopedElement(ScopedElement&& other) noexcept :
        m_writer(other.m_writer), m_fmt(other.m_fmt) {
        other.m_writer = nullptr;
        other.m_fmt = XmlFormatting::None;
    }
    XmlWriter::ScopedElement& XmlWriter::ScopedElement::operator=(ScopedElement&& other) noexcept {
        if (m_writer) {
            m_writer->endElement();
        }
        m_writer = other.m_writer;
        other.m_writer = nullptr;
        m_fmt = other.m_fmt;
        other.m_fmt = XmlFormatting::None;
        return *this;
    }

    XmlWriter::ScopedElement::~ScopedElement() {
        if (m_writer) {
            m_writer->endElement(m_fmt);
        }
    }

    XmlWriter::ScopedElement& XmlWriter::ScopedElement::writeText(std::string const& text,
                                                                  XmlFormatting fmt) {
        m_writer->writeText(text, fmt);
        return *this;
    }

    XmlWriter::XmlWriter(std::ostream& os) : m_os(os) { writeDeclaration(); }

    XmlWriter::~XmlWriter() {
        while (!m_tags.empty()) {
            endElement();
        }
        newlineIfNecessary();
    }

    XmlWriter& XmlWriter::startElement(std::string const& name, XmlFormatting fmt) {
        ensureTagClosed();
        newlineIfNecessary();
        if (shouldIndent(fmt)) {
            m_os << m_indent;
            m_indent += "  ";
        }
        m_os << '<' << name;
        m_tags.push_back(name);
        m_tagIsOpen = true;
        applyFormatting(fmt);
        return *this;
    }

    XmlWriter::ScopedElement XmlWriter::scopedElement(std::string const& name, XmlFormatting fmt) {
        ScopedElement scoped(this, fmt);
        startElement(name, fmt);
        return scoped;
    }

    XmlWriter& XmlWriter::endElement(XmlFormatting fmt) {
        m_indent = m_indent.substr(0, m_indent.size() - 2);

        if (m_tagIsOpen) {
            m_os << "/>";
            m_tagIsOpen = false;
        } else {
            newlineIfNecessary();
            if (shouldIndent(fmt)) {
                m_os << m_indent;
            }
            m_os << "</" << m_tags.back() << ">";
        }
        m_os << std::flush;
        applyFormatting(fmt);
        m_tags.pop_back();
        return *this;
    }

    XmlWriter& XmlWriter::writeAttribute(std::string const& name, std::string const& attribute) {
        if (!name.empty() && !attribute.empty())
            m_os << ' ' << name << "=\"" << XmlEncode(attribute, XmlEncode::ForAttributes) << '"';
        return *this;
    }

    XmlWriter& XmlWriter::writeAttribute(std::string const& name, bool attribute) {
        m_os << ' ' << name << "=\"" << (attribute ? "true" : "false") << '"';
        return *this;
    }

    XmlWriter& XmlWriter::writeText(std::string const& text, XmlFormatting fmt) {
        if (!text.empty()) {
            bool tagWasOpen = m_tagIsOpen;
            ensureTagClosed();
            if (tagWasOpen && shouldIndent(fmt)) {
                m_os << m_indent;
            }
            m_os << XmlEncode(text);
            applyFormatting(fmt);
        }
        return *this;
    }

    XmlWriter& XmlWriter::writeComment(std::string const& text, XmlFormatting fmt) {
        ensureTagClosed();
        if (shouldIndent(fmt)) {
            m_os << m_indent;
        }
        m_os << "<!--" << text << "-->";
        applyFormatting(fmt);
        return *this;
    }

    void XmlWriter::writeStylesheetRef(std::string const& url) {
        m_os << "<?xml-stylesheet type=\"text/xsl\" href=\"" << url << "\"?>\n";
    }

    XmlWriter& XmlWriter::writeBlankLine() {
        ensureTagClosed();
        m_os << '\n';
        return *this;
    }

    void XmlWriter::ensureTagClosed() {
        if (m_tagIsOpen) {
            m_os << '>' << std::flush;
            newlineIfNecessary();
            m_tagIsOpen = false;
        }
    }

    void XmlWriter::applyFormatting(XmlFormatting fmt) { m_needsNewline = shouldNewline(fmt); }

    void XmlWriter::writeDeclaration() { m_os << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; }

    void XmlWriter::newlineIfNecessary() {
        if (m_needsNewline) {
            m_os << std::endl;
            m_needsNewline = false;
        }
    }
} // namespace Catch
// end catch_xmlwriter.cpp
// start catch_reporter_bases.cpp

#include <cstring>
#include <cfloat>
#include <cstdio>
#include <cassert>
#include <memory>

namespace Catch {
    void prepareExpandedExpression(AssertionResult& result) { result.getExpandedExpression(); }

    // Because formatting using c++ streams is stateful, drop down to C is
    // required Alternatively we could use stringstream, but its performance
    // is... not good.
    std::string getFormattedDuration(double duration) {
        // Max exponent + 1 is required to represent the whole part
        // + 1 for decimal point
        // + 3 for the 3 decimal places
        // + 1 for null terminator
        const std::size_t maxDoubleSize = DBL_MAX_10_EXP + 1 + 1 + 3 + 1;
        char buffer[maxDoubleSize];

        // Save previous errno, to prevent sprintf from overwriting it
        ErrnoGuard guard;
#ifdef _MSC_VER
        sprintf_s(buffer, "%.3f", duration);
#else
        std::sprintf(buffer, "%.3f", duration);
#endif
        return std::string(buffer);
    }

    bool shouldShowDuration(IConfig const& config, double duration) {
        if (config.showDurations() == ShowDurations::Always) {
            return true;
        }
        if (config.showDurations() == ShowDurations::Never) {
            return false;
        }
        const double min = config.minDuration();
        return min >= 0 && duration >= min;
    }

    std::string serializeFilters(std::vector<std::string> const& container) {
        ReusableStringStream oss;
        bool first = true;
        for (auto&& filter : container) {
            if (!first)
                oss << ' ';
            else
                first = false;

            oss << filter;
        }
        return oss.str();
    }

    TestEventListenerBase::TestEventListenerBase(ReporterConfig const& _config) :
        StreamingReporterBase(_config) {}

    std::set<Verbosity> TestEventListenerBase::getSupportedVerbosities() {
        return {Verbosity::Quiet, Verbosity::Normal, Verbosity::High};
    }

    void TestEventListenerBase::assertionStarting(AssertionInfo const&) {}

    bool TestEventListenerBase::assertionEnded(AssertionStats const&) { return false; }

} // end namespace Catch
// end catch_reporter_bases.cpp
// start catch_reporter_compact.cpp

namespace {

#ifdef CATCH_PLATFORM_MAC
    const char* failedString() { return "FAILED"; }
    const char* passedString() { return "PASSED"; }
#else
    const char* failedString() { return "failed"; }
    const char* passedString() { return "passed"; }
#endif

    // Colour::LightGrey
    Catch::Colour::Code dimColour() { return Catch::Colour::FileName; }

    std::string bothOrAll(std::size_t count) {
        return count == 1 ? std::string() : count == 2 ? "both " : "all ";
    }

} // namespace

namespace Catch {
    namespace {
        // Colour, message variants:
        // - white: No tests ran.
        // -   red: Failed [both/all] N test cases, failed [both/all] M
        // assertions.
        // - white: Passed [both/all] N test cases (no assertions).
        // -   red: Failed N tests cases, failed M assertions.
        // - green: Passed [both/all] N tests cases with M assertions.
        void printTotals(std::ostream& out, const Totals& totals) {
            if (totals.testCases.total() == 0) {
                out << "No tests ran.";
            } else if (totals.testCases.failed == totals.testCases.total()) {
                Colour colour(Colour::ResultError);
                const std::string qualify_assertions_failed =
                    totals.assertions.failed == totals.assertions.total()
                        ? bothOrAll(totals.assertions.failed)
                        : std::string();
                out << "Failed " << bothOrAll(totals.testCases.failed)
                    << pluralise(totals.testCases.failed, "test case")
                    << ", "
                       "failed "
                    << qualify_assertions_failed << pluralise(totals.assertions.failed, "assertion")
                    << '.';
            } else if (totals.assertions.total() == 0) {
                out << "Passed " << bothOrAll(totals.testCases.total())
                    << pluralise(totals.testCases.total(), "test case") << " (no assertions).";
            } else if (totals.assertions.failed) {
                Colour colour(Colour::ResultError);
                out << "Failed " << pluralise(totals.testCases.failed, "test case")
                    << ", "
                       "failed "
                    << pluralise(totals.assertions.failed, "assertion") << '.';
            } else {
                Colour colour(Colour::ResultSuccess);
                out << "Passed " << bothOrAll(totals.testCases.passed)
                    << pluralise(totals.testCases.passed, "test case") << " with "
                    << pluralise(totals.assertions.passed, "assertion") << '.';
            }
        }

        // Implementation of CompactReporter formatting
        class AssertionPrinter {
        public:
            AssertionPrinter& operator=(AssertionPrinter const&) = delete;
            AssertionPrinter(AssertionPrinter const&) = delete;
            AssertionPrinter(std::ostream& _stream,
                             AssertionStats const& _stats,
                             bool _printInfoMessages) :
                stream(_stream),
                result(_stats.assertionResult),
                messages(_stats.infoMessages),
                itMessage(_stats.infoMessages.begin()),
                printInfoMessages(_printInfoMessages) {}

            void print() {
                printSourceInfo();

                itMessage = messages.begin();

                switch (result.getResultType()) {
                    case ResultWas::Ok:
                        printResultType(Colour::ResultSuccess, passedString());
                        printOriginalExpression();
                        printReconstructedExpression();
                        if (!result.hasExpression())
                            printRemainingMessages(Colour::None);
                        else
                            printRemainingMessages();
                        break;
                    case ResultWas::ExpressionFailed:
                        if (result.isOk())
                            printResultType(Colour::ResultSuccess,
                                            failedString() + std::string(" - but was ok"));
                        else
                            printResultType(Colour::Error, failedString());
                        printOriginalExpression();
                        printReconstructedExpression();
                        printRemainingMessages();
                        break;
                    case ResultWas::ThrewException:
                        printResultType(Colour::Error, failedString());
                        printIssue("unexpected exception with message:");
                        printMessage();
                        printExpressionWas();
                        printRemainingMessages();
                        break;
                    case ResultWas::FatalErrorCondition:
                        printResultType(Colour::Error, failedString());
                        printIssue("fatal error condition with message:");
                        printMessage();
                        printExpressionWas();
                        printRemainingMessages();
                        break;
                    case ResultWas::DidntThrowException:
                        printResultType(Colour::Error, failedString());
                        printIssue("expected exception, got none");
                        printExpressionWas();
                        printRemainingMessages();
                        break;
                    case ResultWas::Info:
                        printResultType(Colour::None, "info");
                        printMessage();
                        printRemainingMessages();
                        break;
                    case ResultWas::Warning:
                        printResultType(Colour::None, "warning");
                        printMessage();
                        printRemainingMessages();
                        break;
                    case ResultWas::ExplicitFailure:
                        printResultType(Colour::Error, failedString());
                        printIssue("explicitly");
                        printRemainingMessages(Colour::None);
                        break;
                        // These cases are here to prevent compiler warnings
                    case ResultWas::Unknown:
                    case ResultWas::FailureBit:
                    case ResultWas::Exception:
                        printResultType(Colour::Error, "** internal error **");
                        break;
                }
            }

        private:
            void printSourceInfo() const {
                Colour colourGuard(Colour::FileName);
                stream << result.getSourceInfo() << ':';
            }

            void printResultType(Colour::Code colour, std::string const& passOrFail) const {
                if (!passOrFail.empty()) {
                    {
                        Colour colourGuard(colour);
                        stream << ' ' << passOrFail;
                    }
                    stream << ':';
                }
            }

            void printIssue(std::string const& issue) const { stream << ' ' << issue; }

            void printExpressionWas() {
                if (result.hasExpression()) {
                    stream << ';';
                    {
                        Colour colour(dimColour());
                        stream << " expression was:";
                    }
                    printOriginalExpression();
                }
            }

            void printOriginalExpression() const {
                if (result.hasExpression()) {
                    stream << ' ' << result.getExpression();
                }
            }

            void printReconstructedExpression() const {
                if (result.hasExpandedExpression()) {
                    {
                        Colour colour(dimColour());
                        stream << " for: ";
                    }
                    stream << result.getExpandedExpression();
                }
            }

            void printMessage() {
                if (itMessage != messages.end()) {
                    stream << " '" << itMessage->message << '\'';
                    ++itMessage;
                }
            }

            void printRemainingMessages(Colour::Code colour = dimColour()) {
                if (itMessage == messages.end())
                    return;

                const auto itEnd = messages.cend();
                const auto N = static_cast<std::size_t>(std::distance(itMessage, itEnd));

                {
                    Colour colourGuard(colour);
                    stream << " with " << pluralise(N, "message") << ':';
                }

                while (itMessage != itEnd) {
                    // If this assertion is a warning ignore any INFO messages
                    if (printInfoMessages || itMessage->type != ResultWas::Info) {
                        printMessage();
                        if (itMessage != itEnd) {
                            Colour colourGuard(dimColour());
                            stream << " and";
                        }
                        continue;
                    }
                    ++itMessage;
                }
            }

        private:
            std::ostream& stream;
            AssertionResult const& result;
            std::vector<MessageInfo> messages;
            std::vector<MessageInfo>::const_iterator itMessage;
            bool printInfoMessages;
        };

    } // namespace

    std::string CompactReporter::getDescription() {
        return "Reports test results on a single line, suitable for IDEs";
    }

    void CompactReporter::noMatchingTestCases(std::string const& spec) {
        stream << "No test cases matched '" << spec << '\'' << std::endl;
    }

    void CompactReporter::assertionStarting(AssertionInfo const&) {}

    bool CompactReporter::assertionEnded(AssertionStats const& _assertionStats) {
        AssertionResult const& result = _assertionStats.assertionResult;

        bool printInfoMessages = true;

        // Drop out if result was successful and we're not printing those
        if (!m_config->includeSuccessfulResults() && result.isOk()) {
            if (result.getResultType() != ResultWas::Warning)
                return false;
            printInfoMessages = false;
        }

        AssertionPrinter printer(stream, _assertionStats, printInfoMessages);
        printer.print();

        stream << std::endl;
        return true;
    }

    void CompactReporter::sectionEnded(SectionStats const& _sectionStats) {
        double dur = _sectionStats.durationInSeconds;
        if (shouldShowDuration(*m_config, dur)) {
            stream << getFormattedDuration(dur) << " s: " << _sectionStats.sectionInfo.name
                   << std::endl;
        }
    }

    void CompactReporter::testRunEnded(TestRunStats const& _testRunStats) {
        printTotals(stream, _testRunStats.totals);
        stream << '\n' << std::endl;
        StreamingReporterBase::testRunEnded(_testRunStats);
    }

    CompactReporter::~CompactReporter() {}

    CATCH_REGISTER_REPORTER("compact", CompactReporter)

} // end namespace Catch
// end catch_reporter_compact.cpp
// start catch_reporter_console.cpp

#include <cfloat>
#include <cstdio>

#if defined(_MSC_VER)
#pragma warning(push)
#pragma warning(disable : 4061) // Not all labels are EXPLICITLY handled in switch
  // Note that 4062 (not all labels are handled and default is missing) is
  // enabled
#endif

#if defined(__clang__)
#pragma clang diagnostic push
// For simplicity, benchmarking-only helpers are always enabled
#pragma clang diagnostic ignored "-Wunused-function"
#endif

namespace Catch {

    namespace {

        // Formatter impl for ConsoleReporter
        class ConsoleAssertionPrinter {
        public:
            ConsoleAssertionPrinter& operator=(ConsoleAssertionPrinter const&) = delete;
            ConsoleAssertionPrinter(ConsoleAssertionPrinter const&) = delete;
            ConsoleAssertionPrinter(std::ostream& _stream,
                                    AssertionStats const& _stats,
                                    bool _printInfoMessages) :
                stream(_stream),
                stats(_stats),
                result(_stats.assertionResult),
                colour(Colour::None),
                message(result.getMessage()),
                messages(_stats.infoMessages),
                printInfoMessages(_printInfoMessages) {
                switch (result.getResultType()) {
                    case ResultWas::Ok:
                        colour = Colour::Success;
                        passOrFail = "PASSED";
                        // if( result.hasMessage() )
                        if (_stats.infoMessages.size() == 1)
                            messageLabel = "with message";
                        if (_stats.infoMessages.size() > 1)
                            messageLabel = "with messages";
                        break;
                    case ResultWas::ExpressionFailed:
                        if (result.isOk()) {
                            colour = Colour::Success;
                            passOrFail = "FAILED - but was ok";
                        } else {
                            colour = Colour::Error;
                            passOrFail = "FAILED";
                        }
                        if (_stats.infoMessages.size() == 1)
                            messageLabel = "with message";
                        if (_stats.infoMessages.size() > 1)
                            messageLabel = "with messages";
                        break;
                    case ResultWas::ThrewException:
                        colour = Colour::Error;
                        passOrFail = "FAILED";
                        messageLabel = "due to unexpected exception with ";
                        if (_stats.infoMessages.size() == 1)
                            messageLabel += "message";
                        if (_stats.infoMessages.size() > 1)
                            messageLabel += "messages";
                        break;
                    case ResultWas::FatalErrorCondition:
                        colour = Colour::Error;
                        passOrFail = "FAILED";
                        messageLabel = "due to a fatal error condition";
                        break;
                    case ResultWas::DidntThrowException:
                        colour = Colour::Error;
                        passOrFail = "FAILED";
                        messageLabel = "because no exception was thrown where "
                                       "one was expected";
                        break;
                    case ResultWas::Info:
                        messageLabel = "info";
                        break;
                    case ResultWas::Warning:
                        messageLabel = "warning";
                        break;
                    case ResultWas::ExplicitFailure:
                        passOrFail = "FAILED";
                        colour = Colour::Error;
                        if (_stats.infoMessages.size() == 1)
                            messageLabel = "explicitly with message";
                        if (_stats.infoMessages.size() > 1)
                            messageLabel = "explicitly with messages";
                        break;
                        // These cases are here to prevent compiler warnings
                    case ResultWas::Unknown:
                    case ResultWas::FailureBit:
                    case ResultWas::Exception:
                        passOrFail = "** internal error **";
                        colour = Colour::Error;
                        break;
                }
            }

            void print() const {
                printSourceInfo();
                if (stats.totals.assertions.total() > 0) {
                    printResultType();
                    printOriginalExpression();
                    printReconstructedExpression();
                } else {
                    stream << '\n';
                }
                printMessage();
            }

        private:
            void printResultType() const {
                if (!passOrFail.empty()) {
                    Colour colourGuard(colour);
                    stream << passOrFail << ":\n";
                }
            }
            void printOriginalExpression() const {
                if (result.hasExpression()) {
                    Colour colourGuard(Colour::OriginalExpression);
                    stream << "  ";
                    stream << result.getExpressionInMacro();
                    stream << '\n';
                }
            }
            void printReconstructedExpression() const {
                if (result.hasExpandedExpression()) {
                    stream << "with expansion:\n";
                    Colour colourGuard(Colour::ReconstructedExpression);
                    stream << Column(result.getExpandedExpression()).indent(2) << '\n';
                }
            }
            void printMessage() const {
                if (!messageLabel.empty())
                    stream << messageLabel << ':' << '\n';
                for (auto const& msg : messages) {
                    // If this assertion is a warning ignore any INFO messages
                    if (printInfoMessages || msg.type != ResultWas::Info)
                        stream << Column(msg.message).indent(2) << '\n';
                }
            }
            void printSourceInfo() const {
                Colour colourGuard(Colour::FileName);
                stream << result.getSourceInfo() << ": ";
            }

            std::ostream& stream;
            AssertionStats const& stats;
            AssertionResult const& result;
            Colour::Code colour;
            std::string passOrFail;
            std::string messageLabel;
            std::string message;
            std::vector<MessageInfo> messages;
            bool printInfoMessages;
        };

        std::size_t makeRatio(std::size_t number, std::size_t total) {
            std::size_t ratio = total > 0 ? CATCH_CONFIG_CONSOLE_WIDTH * number / total : 0;
            return (ratio == 0 && number > 0) ? 1 : ratio;
        }

        std::size_t& findMax(std::size_t& i, std::size_t& j, std::size_t& k) {
            if (i > j && i > k)
                return i;
            else if (j > k)
                return j;
            else
                return k;
        }

        struct ColumnInfo {
            enum Justification { Left, Right };
            std::string name;
            int width;
            Justification justification;
        };
        struct ColumnBreak {};
        struct RowBreak {};

        class Duration {
            enum class Unit { Auto, Nanoseconds, Microseconds, Milliseconds, Seconds, Minutes };
            static const uint64_t s_nanosecondsInAMicrosecond = 1000;
            static const uint64_t s_nanosecondsInAMillisecond = 1000 * s_nanosecondsInAMicrosecond;
            static const uint64_t s_nanosecondsInASecond = 1000 * s_nanosecondsInAMillisecond;
            static const uint64_t s_nanosecondsInAMinute = 60 * s_nanosecondsInASecond;

            double m_inNanoseconds;
            Unit m_units;

        public:
            explicit Duration(double inNanoseconds, Unit units = Unit::Auto) :
                m_inNanoseconds(inNanoseconds), m_units(units) {
                if (m_units == Unit::Auto) {
                    if (m_inNanoseconds < s_nanosecondsInAMicrosecond)
                        m_units = Unit::Nanoseconds;
                    else if (m_inNanoseconds < s_nanosecondsInAMillisecond)
                        m_units = Unit::Microseconds;
                    else if (m_inNanoseconds < s_nanosecondsInASecond)
                        m_units = Unit::Milliseconds;
                    else if (m_inNanoseconds < s_nanosecondsInAMinute)
                        m_units = Unit::Seconds;
                    else
                        m_units = Unit::Minutes;
                }
            }

            auto value() const -> double {
                switch (m_units) {
                    case Unit::Microseconds:
                        return m_inNanoseconds / static_cast<double>(s_nanosecondsInAMicrosecond);
                    case Unit::Milliseconds:
                        return m_inNanoseconds / static_cast<double>(s_nanosecondsInAMillisecond);
                    case Unit::Seconds:
                        return m_inNanoseconds / static_cast<double>(s_nanosecondsInASecond);
                    case Unit::Minutes:
                        return m_inNanoseconds / static_cast<double>(s_nanosecondsInAMinute);
                    default:
                        return m_inNanoseconds;
                }
            }
            auto unitsAsString() const -> std::string {
                switch (m_units) {
                    case Unit::Nanoseconds:
                        return "ns";
                    case Unit::Microseconds:
                        return "us";
                    case Unit::Milliseconds:
                        return "ms";
                    case Unit::Seconds:
                        return "s";
                    case Unit::Minutes:
                        return "m";
                    default:
                        return "** internal error **";
                }
            }
            friend auto operator<<(std::ostream& os, Duration const& duration) -> std::ostream& {
                return os << duration.value() << ' ' << duration.unitsAsString();
            }
        };
    } // namespace

    class TablePrinter {
        std::ostream& m_os;
        std::vector<ColumnInfo> m_columnInfos;
        std::ostringstream m_oss;
        int m_currentColumn = -1;
        bool m_isOpen = false;

    public:
        TablePrinter(std::ostream& os, std::vector<ColumnInfo> columnInfos) :
            m_os(os), m_columnInfos(std::move(columnInfos)) {}

        auto columnInfos() const -> std::vector<ColumnInfo> const& { return m_columnInfos; }

        void open() {
            if (!m_isOpen) {
                m_isOpen = true;
                *this << RowBreak();

                Columns headerCols;
                Spacer spacer(2);
                for (auto const& info : m_columnInfos) {
                    headerCols += Column(info.name).width(static_cast<std::size_t>(info.width - 2));
                    headerCols += spacer;
                }
                m_os << headerCols << '\n';

                m_os << Catch::getLineOfChars<'-'>() << '\n';
            }
        }
        void close() {
            if (m_isOpen) {
                *this << RowBreak();
                m_os << std::endl;
                m_isOpen = false;
            }
        }

        template <typename T> friend TablePrinter& operator<<(TablePrinter& tp, T const& value) {
            tp.m_oss << value;
            return tp;
        }

        friend TablePrinter& operator<<(TablePrinter& tp, ColumnBreak) {
            auto colStr = tp.m_oss.str();
            const auto strSize = colStr.size();
            tp.m_oss.str("");
            tp.open();
            if (tp.m_currentColumn == static_cast<int>(tp.m_columnInfos.size() - 1)) {
                tp.m_currentColumn = -1;
                tp.m_os << '\n';
            }
            tp.m_currentColumn++;

            auto colInfo = tp.m_columnInfos[tp.m_currentColumn];
            auto padding = (strSize + 1 < static_cast<std::size_t>(colInfo.width))
                               ? std::string(colInfo.width - (strSize + 1), ' ')
                               : std::string();
            if (colInfo.justification == ColumnInfo::Left)
                tp.m_os << colStr << padding << ' ';
            else
                tp.m_os << padding << colStr << ' ';
            return tp;
        }

        friend TablePrinter& operator<<(TablePrinter& tp, RowBreak) {
            if (tp.m_currentColumn > 0) {
                tp.m_os << '\n';
                tp.m_currentColumn = -1;
            }
            return tp;
        }
    };

    ConsoleReporter::ConsoleReporter(ReporterConfig const& config) :
        StreamingReporterBase(config),
        m_tablePrinter(new TablePrinter(config.stream(), [&config]() -> std::vector<ColumnInfo> {
            if (config.fullConfig()->benchmarkNoAnalysis()) {
                return {{"benchmark name", CATCH_CONFIG_CONSOLE_WIDTH - 43, ColumnInfo::Left},
                        {"     samples", 14, ColumnInfo::Right},
                        {"  iterations", 14, ColumnInfo::Right},
                        {"        mean", 14, ColumnInfo::Right}};
            } else {
                return {{"benchmark name", CATCH_CONFIG_CONSOLE_WIDTH - 43, ColumnInfo::Left},
                        {"samples      mean       std dev", 14, ColumnInfo::Right},
                        {"iterations   low mean   low std dev", 14, ColumnInfo::Right},
                        {"estimated    high mean  high std dev", 14, ColumnInfo::Right}};
            }
        }())) {}
    ConsoleReporter::~ConsoleReporter() = default;

    std::string ConsoleReporter::getDescription() {
        return "Reports test results as plain lines of text";
    }

    void ConsoleReporter::noMatchingTestCases(std::string const& spec) {
        stream << "No test cases matched '" << spec << '\'' << std::endl;
    }

    void ConsoleReporter::reportInvalidArguments(std::string const& arg) {
        stream << "Invalid Filter: " << arg << std::endl;
    }

    void ConsoleReporter::assertionStarting(AssertionInfo const&) {}

    bool ConsoleReporter::assertionEnded(AssertionStats const& _assertionStats) {
        AssertionResult const& result = _assertionStats.assertionResult;

        bool includeResults = m_config->includeSuccessfulResults() || !result.isOk();

        // Drop out if result was successful but we're not printing them.
        if (!includeResults && result.getResultType() != ResultWas::Warning)
            return false;

        lazyPrint();

        ConsoleAssertionPrinter printer(stream, _assertionStats, includeResults);
        printer.print();
        stream << std::endl;
        return true;
    }

    void ConsoleReporter::sectionStarting(SectionInfo const& _sectionInfo) {
        m_tablePrinter->close();
        m_headerPrinted = false;
        StreamingReporterBase::sectionStarting(_sectionInfo);
    }
    void ConsoleReporter::sectionEnded(SectionStats const& _sectionStats) {
        m_tablePrinter->close();
        if (_sectionStats.missingAssertions) {
            lazyPrint();
            Colour colour(Colour::ResultError);
            if (m_sectionStack.size() > 1)
                stream << "\nNo assertions in section";
            else
                stream << "\nNo assertions in test case";
            stream << " '" << _sectionStats.sectionInfo.name << "'\n" << std::endl;
        }
        double dur = _sectionStats.durationInSeconds;
        if (shouldShowDuration(*m_config, dur)) {
            stream << getFormattedDuration(dur) << " s: " << _sectionStats.sectionInfo.name
                   << std::endl;
        }
        if (m_headerPrinted) {
            m_headerPrinted = false;
        }
        StreamingReporterBase::sectionEnded(_sectionStats);
    }

#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
    void ConsoleReporter::benchmarkPreparing(std::string const& name) {
        lazyPrintWithoutClosingBenchmarkTable();

        auto nameCol = Column(name).width(
            static_cast<std::size_t>(m_tablePrinter->columnInfos()[0].width - 2));

        bool firstLine = true;
        for (auto line : nameCol) {
            if (!firstLine)
                (*m_tablePrinter) << ColumnBreak() << ColumnBreak() << ColumnBreak();
            else
                firstLine = false;

            (*m_tablePrinter) << line << ColumnBreak();
        }
    }

    void ConsoleReporter::benchmarkStarting(BenchmarkInfo const& info) {
        (*m_tablePrinter) << info.samples << ColumnBreak() << info.iterations << ColumnBreak();
        if (!m_config->benchmarkNoAnalysis())
            (*m_tablePrinter) << Duration(info.estimatedDuration) << ColumnBreak();
    }
    void ConsoleReporter::benchmarkEnded(BenchmarkStats<> const& stats) {
        if (m_config->benchmarkNoAnalysis()) {
            (*m_tablePrinter) << Duration(stats.mean.point.count()) << ColumnBreak();
        } else {
            (*m_tablePrinter) << ColumnBreak() << Duration(stats.mean.point.count())
                              << ColumnBreak() << Duration(stats.mean.lower_bound.count())
                              << ColumnBreak() << Duration(stats.mean.upper_bound.count())
                              << ColumnBreak() << ColumnBreak()
                              << Duration(stats.standardDeviation.point.count()) << ColumnBreak()
                              << Duration(stats.standardDeviation.lower_bound.count())
                              << ColumnBreak()
                              << Duration(stats.standardDeviation.upper_bound.count())
                              << ColumnBreak() << ColumnBreak() << ColumnBreak() << ColumnBreak()
                              << ColumnBreak();
        }
    }

    void ConsoleReporter::benchmarkFailed(std::string const& error) {
        Colour colour(Colour::Red);
        (*m_tablePrinter) << "Benchmark failed (" << error << ')' << ColumnBreak() << RowBreak();
    }
#endif // CATCH_CONFIG_ENABLE_BENCHMARKING

    void ConsoleReporter::testCaseEnded(TestCaseStats const& _testCaseStats) {
        m_tablePrinter->close();
        StreamingReporterBase::testCaseEnded(_testCaseStats);
        m_headerPrinted = false;
    }
    void ConsoleReporter::testGroupEnded(TestGroupStats const& _testGroupStats) {
        if (currentGroupInfo.used) {
            printSummaryDivider();
            stream << "Summary for group '" << _testGroupStats.groupInfo.name << "':\n";
            printTotals(_testGroupStats.totals);
            stream << '\n' << std::endl;
        }
        StreamingReporterBase::testGroupEnded(_testGroupStats);
    }
    void ConsoleReporter::testRunEnded(TestRunStats const& _testRunStats) {
        printTotalsDivider(_testRunStats.totals);
        printTotals(_testRunStats.totals);
        stream << std::endl;
        StreamingReporterBase::testRunEnded(_testRunStats);
    }
    void ConsoleReporter::testRunStarting(TestRunInfo const& _testInfo) {
        StreamingReporterBase::testRunStarting(_testInfo);
        printTestFilters();
    }

    void ConsoleReporter::lazyPrint() {

        m_tablePrinter->close();
        lazyPrintWithoutClosingBenchmarkTable();
    }

    void ConsoleReporter::lazyPrintWithoutClosingBenchmarkTable() {

        if (!currentTestRunInfo.used)
            lazyPrintRunInfo();
        if (!currentGroupInfo.used)
            lazyPrintGroupInfo();

        if (!m_headerPrinted) {
            printTestCaseAndSectionHeader();
            m_headerPrinted = true;
        }
    }
    void ConsoleReporter::lazyPrintRunInfo() {
        stream << '\n' << getLineOfChars<'~'>() << '\n';
        Colour colour(Colour::SecondaryText);
        stream << currentTestRunInfo->name << " is a Catch v" << libraryVersion()
               << " host application.\n"
               << "Run with -? for options\n\n";

        if (m_config->rngSeed() != 0)
            stream << "Randomness seeded to: " << m_config->rngSeed() << "\n\n";

        currentTestRunInfo.used = true;
    }
    void ConsoleReporter::lazyPrintGroupInfo() {
        if (!currentGroupInfo->name.empty() && currentGroupInfo->groupsCounts > 1) {
            printClosedHeader("Group: " + currentGroupInfo->name);
            currentGroupInfo.used = true;
        }
    }
    void ConsoleReporter::printTestCaseAndSectionHeader() {
        assert(!m_sectionStack.empty());
        printOpenHeader(currentTestCaseInfo->name);

        if (m_sectionStack.size() > 1) {
            Colour colourGuard(Colour::Headers);

            auto it = m_sectionStack.begin() + 1, // Skip first section (test case)
                itEnd = m_sectionStack.end();
            for (; it != itEnd; ++it)
                printHeaderString(it->name, 2);
        }

        SourceLineInfo lineInfo = m_sectionStack.back().lineInfo;

        stream << getLineOfChars<'-'>() << '\n';
        Colour colourGuard(Colour::FileName);
        stream << lineInfo << '\n';
        stream << getLineOfChars<'.'>() << '\n' << std::endl;
    }

    void ConsoleReporter::printClosedHeader(std::string const& _name) {
        printOpenHeader(_name);
        stream << getLineOfChars<'.'>() << '\n';
    }
    void ConsoleReporter::printOpenHeader(std::string const& _name) {
        stream << getLineOfChars<'-'>() << '\n';
        {
            Colour colourGuard(Colour::Headers);
            printHeaderString(_name);
        }
    }

    // if string has a : in first line will set indent to follow it on
    // subsequent lines
    void ConsoleReporter::printHeaderString(std::string const& _string, std::size_t indent) {
        std::size_t i = _string.find(": ");
        if (i != std::string::npos)
            i += 2;
        else
            i = 0;
        stream << Column(_string).indent(indent + i).initialIndent(indent) << '\n';
    }

    struct SummaryColumn {

        SummaryColumn(std::string _label, Colour::Code _colour) :
            label(std::move(_label)), colour(_colour) {}
        SummaryColumn addRow(std::size_t count) {
            ReusableStringStream rss;
            rss << count;
            std::string row = rss.str();
            for (auto& oldRow : rows) {
                while (oldRow.size() < row.size())
                    oldRow = ' ' + oldRow;
                while (oldRow.size() > row.size())
                    row = ' ' + row;
            }
            rows.push_back(row);
            return *this;
        }

        std::string label;
        Colour::Code colour;
        std::vector<std::string> rows;
    };

    void ConsoleReporter::printTotals(Totals const& totals) {
        if (totals.testCases.total() == 0) {
            stream << Colour(Colour::Warning) << "No tests ran\n";
        } else if (totals.assertions.total() > 0 && totals.testCases.allPassed()) {
            stream << Colour(Colour::ResultSuccess) << "All tests passed";
            stream << " (" << pluralise(totals.assertions.passed, "assertion") << " in "
                   << pluralise(totals.testCases.passed, "test case") << ')' << '\n';
        } else {

            std::vector<SummaryColumn> columns;
            columns.push_back(SummaryColumn("", Colour::None)
                                  .addRow(totals.testCases.total())
                                  .addRow(totals.assertions.total()));
            columns.push_back(SummaryColumn("passed", Colour::Success)
                                  .addRow(totals.testCases.passed)
                                  .addRow(totals.assertions.passed));
            columns.push_back(SummaryColumn("failed", Colour::ResultError)
                                  .addRow(totals.testCases.failed)
                                  .addRow(totals.assertions.failed));
            columns.push_back(SummaryColumn("failed as expected", Colour::ResultExpectedFailure)
                                  .addRow(totals.testCases.failedButOk)
                                  .addRow(totals.assertions.failedButOk));

            printSummaryRow("test cases", columns, 0);
            printSummaryRow("assertions", columns, 1);
        }
    }
    void ConsoleReporter::printSummaryRow(std::string const& label,
                                          std::vector<SummaryColumn> const& cols,
                                          std::size_t row) {
        for (auto col : cols) {
            std::string value = col.rows[row];
            if (col.label.empty()) {
                stream << label << ": ";
                if (value != "0")
                    stream << value;
                else
                    stream << Colour(Colour::Warning) << "- none -";
            } else if (value != "0") {
                stream << Colour(Colour::LightGrey) << " | ";
                stream << Colour(col.colour) << value << ' ' << col.label;
            }
        }
        stream << '\n';
    }

    void ConsoleReporter::printTotalsDivider(Totals const& totals) {
        if (totals.testCases.total() > 0) {
            std::size_t failedRatio = makeRatio(totals.testCases.failed, totals.testCases.total());
            std::size_t failedButOkRatio =
                makeRatio(totals.testCases.failedButOk, totals.testCases.total());
            std::size_t passedRatio = makeRatio(totals.testCases.passed, totals.testCases.total());
            while (failedRatio + failedButOkRatio + passedRatio < CATCH_CONFIG_CONSOLE_WIDTH - 1)
                findMax(failedRatio, failedButOkRatio, passedRatio)++;
            while (failedRatio + failedButOkRatio + passedRatio > CATCH_CONFIG_CONSOLE_WIDTH - 1)
                findMax(failedRatio, failedButOkRatio, passedRatio)--;

            stream << Colour(Colour::Error) << std::string(failedRatio, '=');
            stream << Colour(Colour::ResultExpectedFailure) << std::string(failedButOkRatio, '=');
            if (totals.testCases.allPassed())
                stream << Colour(Colour::ResultSuccess) << std::string(passedRatio, '=');
            else
                stream << Colour(Colour::Success) << std::string(passedRatio, '=');
        } else {
            stream << Colour(Colour::Warning) << std::string(CATCH_CONFIG_CONSOLE_WIDTH - 1, '=');
        }
        stream << '\n';
    }
    void ConsoleReporter::printSummaryDivider() { stream << getLineOfChars<'-'>() << '\n'; }

    void ConsoleReporter::printTestFilters() {
        if (m_config->testSpec().hasFilters()) {
            Colour guard(Colour::BrightYellow);
            stream << "Filters: " << serializeFilters(m_config->getTestsOrTags()) << '\n';
        }
    }

    CATCH_REGISTER_REPORTER("console", ConsoleReporter)

} // end namespace Catch

#if defined(_MSC_VER)
#pragma warning(pop)
#endif

#if defined(__clang__)
#pragma clang diagnostic pop
#endif
// end catch_reporter_console.cpp
// start catch_reporter_junit.cpp

#include <cassert>
#include <sstream>
#include <ctime>
#include <algorithm>
#include <iomanip>

namespace Catch {

    namespace {
        std::string getCurrentTimestamp() {
            // Beware, this is not reentrant because of backward compatibility
            // issues Also, UTC only, again because of backward compatibility
            // (%z is C++11)
            time_t rawtime;
            std::time(&rawtime);
            auto const timeStampSize = sizeof("2017-01-16T17:06:45Z");

#ifdef _MSC_VER
            std::tm timeInfo = {};
            gmtime_s(&timeInfo, &rawtime);
#else
            std::tm* timeInfo;
            timeInfo = std::gmtime(&rawtime);
#endif

            char timeStamp[timeStampSize];
            const char* const fmt = "%Y-%m-%dT%H:%M:%SZ";

#ifdef _MSC_VER
            std::strftime(timeStamp, timeStampSize, fmt, &timeInfo);
#else
            std::strftime(timeStamp, timeStampSize, fmt, timeInfo);
#endif
            return std::string(timeStamp, timeStampSize - 1);
        }

        std::string fileNameTag(const std::vector<std::string>& tags) {
            auto it = std::find_if(
                begin(tags), end(tags), [](std::string const& tag) { return tag.front() == '#'; });
            if (it != tags.end())
                return it->substr(1);
            return std::string();
        }

        // Formats the duration in seconds to 3 decimal places.
        // This is done because some genius defined Maven Surefire schema
        // in a way that only accepts 3 decimal places, and tools like
        // Jenkins use that schema for validation JUnit reporter output.
        std::string formatDuration(double seconds) {
            ReusableStringStream rss;
            rss << std::fixed << std::setprecision(3) << seconds;
            return rss.str();
        }

    } // anonymous namespace

    JunitReporter::JunitReporter(ReporterConfig const& _config) :
        CumulativeReporterBase(_config), xml(_config.stream()) {
        m_reporterPrefs.shouldRedirectStdOut = true;
        m_reporterPrefs.shouldReportAllAssertions = true;
    }

    JunitReporter::~JunitReporter() {}

    std::string JunitReporter::getDescription() {
        return "Reports test results in an XML format that looks like Ant's "
               "junitreport target";
    }

    void JunitReporter::noMatchingTestCases(std::string const& /*spec*/) {}

    void JunitReporter::testRunStarting(TestRunInfo const& runInfo) {
        CumulativeReporterBase::testRunStarting(runInfo);
        xml.startElement("testsuites");
    }

    void JunitReporter::testGroupStarting(GroupInfo const& groupInfo) {
        suiteTimer.start();
        stdOutForSuite.clear();
        stdErrForSuite.clear();
        unexpectedExceptions = 0;
        CumulativeReporterBase::testGroupStarting(groupInfo);
    }

    void JunitReporter::testCaseStarting(TestCaseInfo const& testCaseInfo) {
        m_okToFail = testCaseInfo.okToFail();
    }

    bool JunitReporter::assertionEnded(AssertionStats const& assertionStats) {
        if (assertionStats.assertionResult.getResultType() == ResultWas::ThrewException &&
            !m_okToFail)
            unexpectedExceptions++;
        return CumulativeReporterBase::assertionEnded(assertionStats);
    }

    void JunitReporter::testCaseEnded(TestCaseStats const& testCaseStats) {
        stdOutForSuite += testCaseStats.stdOut;
        stdErrForSuite += testCaseStats.stdErr;
        CumulativeReporterBase::testCaseEnded(testCaseStats);
    }

    void JunitReporter::testGroupEnded(TestGroupStats const& testGroupStats) {
        double suiteTime = suiteTimer.getElapsedSeconds();
        CumulativeReporterBase::testGroupEnded(testGroupStats);
        writeGroup(*m_testGroups.back(), suiteTime);
    }

    void JunitReporter::testRunEndedCumulative() { xml.endElement(); }

    void JunitReporter::writeGroup(TestGroupNode const& groupNode, double suiteTime) {
        XmlWriter::ScopedElement e = xml.scopedElement("testsuite");

        TestGroupStats const& stats = groupNode.value;
        xml.writeAttribute("name", stats.groupInfo.name);
        xml.writeAttribute("errors", unexpectedExceptions);
        xml.writeAttribute("failures", stats.totals.assertions.failed - unexpectedExceptions);
        xml.writeAttribute("tests", stats.totals.assertions.total());
        xml.writeAttribute("hostname", "tbd"); // !TBD
        if (m_config->showDurations() == ShowDurations::Never)
            xml.writeAttribute("time", "");
        else
            xml.writeAttribute("time", formatDuration(suiteTime));
        xml.writeAttribute("timestamp", getCurrentTimestamp());

        // Write properties if there are any
        if (m_config->hasTestFilters() || m_config->rngSeed() != 0) {
            auto properties = xml.scopedElement("properties");
            if (m_config->hasTestFilters()) {
                xml.scopedElement("property")
                    .writeAttribute("name", "filters")
                    .writeAttribute("value", serializeFilters(m_config->getTestsOrTags()));
            }
            if (m_config->rngSeed() != 0) {
                xml.scopedElement("property")
                    .writeAttribute("name", "random-seed")
                    .writeAttribute("value", m_config->rngSeed());
            }
        }

        // Write test cases
        for (auto const& child : groupNode.children)
            writeTestCase(*child);

        xml.scopedElement("system-out").writeText(trim(stdOutForSuite), XmlFormatting::Newline);
        xml.scopedElement("system-err").writeText(trim(stdErrForSuite), XmlFormatting::Newline);
    }

    void JunitReporter::writeTestCase(TestCaseNode const& testCaseNode) {
        TestCaseStats const& stats = testCaseNode.value;

        // All test cases have exactly one section - which represents the
        // test case itself. That section may have 0-n nested sections
        assert(testCaseNode.children.size() == 1);
        SectionNode const& rootSection = *testCaseNode.children.front();

        std::string className = stats.testInfo.className;

        if (className.empty()) {
            className = fileNameTag(stats.testInfo.tags);
            if (className.empty())
                className = "global";
        }

        if (!m_config->name().empty())
            className = m_config->name() + "." + className;

        writeSection(className, "", rootSection, stats.testInfo.okToFail());
    }

    void JunitReporter::writeSection(std::string const& className,
                                     std::string const& rootName,
                                     SectionNode const& sectionNode,
                                     bool testOkToFail) {
        std::string name = trim(sectionNode.stats.sectionInfo.name);
        if (!rootName.empty())
            name = rootName + '/' + name;

        if (!sectionNode.assertions.empty() || !sectionNode.stdOut.empty() ||
            !sectionNode.stdErr.empty()) {
            XmlWriter::ScopedElement e = xml.scopedElement("testcase");
            if (className.empty()) {
                xml.writeAttribute("classname", name);
                xml.writeAttribute("name", "root");
            } else {
                xml.writeAttribute("classname", className);
                xml.writeAttribute("name", name);
            }
            xml.writeAttribute("time", formatDuration(sectionNode.stats.durationInSeconds));
            // This is not ideal, but it should be enough to mimic gtest's
            // junit output.
            // Ideally the JUnit reporter would also handle `skipTest`
            // events and write those out appropriately.
            xml.writeAttribute("status", "run");

            if (sectionNode.stats.assertions.failedButOk) {
                xml.scopedElement("skipped").writeAttribute("message",
                                                            "TEST_CASE tagged with !mayfail");
            }

            writeAssertions(sectionNode);

            if (!sectionNode.stdOut.empty())
                xml.scopedElement("system-out")
                    .writeText(trim(sectionNode.stdOut), XmlFormatting::Newline);
            if (!sectionNode.stdErr.empty())
                xml.scopedElement("system-err")
                    .writeText(trim(sectionNode.stdErr), XmlFormatting::Newline);
        }
        for (auto const& childNode : sectionNode.childSections)
            if (className.empty())
                writeSection(name, "", *childNode, testOkToFail);
            else
                writeSection(className, name, *childNode, testOkToFail);
    }

    void JunitReporter::writeAssertions(SectionNode const& sectionNode) {
        for (auto const& assertion : sectionNode.assertions)
            writeAssertion(assertion);
    }

    void JunitReporter::writeAssertion(AssertionStats const& stats) {
        AssertionResult const& result = stats.assertionResult;
        if (!result.isOk()) {
            std::string elementName;
            switch (result.getResultType()) {
                case ResultWas::ThrewException:
                case ResultWas::FatalErrorCondition:
                    elementName = "error";
                    break;
                case ResultWas::ExplicitFailure:
                case ResultWas::ExpressionFailed:
                case ResultWas::DidntThrowException:
                    elementName = "failure";
                    break;

                // We should never see these here:
                case ResultWas::Info:
                case ResultWas::Warning:
                case ResultWas::Ok:
                case ResultWas::Unknown:
                case ResultWas::FailureBit:
                case ResultWas::Exception:
                    elementName = "internalError";
                    break;
            }

            XmlWriter::ScopedElement e = xml.scopedElement(elementName);

            xml.writeAttribute("message", result.getExpression());
            xml.writeAttribute("type", result.getTestMacroName());

            ReusableStringStream rss;
            if (stats.totals.assertions.total() > 0) {
                rss << "FAILED"
                    << ":\n";
                if (result.hasExpression()) {
                    rss << "  ";
                    rss << result.getExpressionInMacro();
                    rss << '\n';
                }
                if (result.hasExpandedExpression()) {
                    rss << "with expansion:\n";
                    rss << Column(result.getExpandedExpression()).indent(2) << '\n';
                }
            } else {
                rss << '\n';
            }

            if (!result.getMessage().empty())
                rss << result.getMessage() << '\n';
            for (auto const& msg : stats.infoMessages)
                if (msg.type == ResultWas::Info)
                    rss << msg.message << '\n';

            rss << "at " << result.getSourceInfo();
            xml.writeText(rss.str(), XmlFormatting::Newline);
        }
    }

    CATCH_REGISTER_REPORTER("junit", JunitReporter)

} // end namespace Catch
// end catch_reporter_junit.cpp
// start catch_reporter_listening.cpp

#include <cassert>

namespace Catch {

    ListeningReporter::ListeningReporter() {
        // We will assume that listeners will always want all assertions
        m_preferences.shouldReportAllAssertions = true;
    }

    void ListeningReporter::addListener(IStreamingReporterPtr&& listener) {
        m_listeners.push_back(std::move(listener));
    }

    void ListeningReporter::addReporter(IStreamingReporterPtr&& reporter) {
        assert(!m_reporter && "Listening reporter can wrap only 1 real reporter");
        m_reporter = std::move(reporter);
        m_preferences.shouldRedirectStdOut = m_reporter->getPreferences().shouldRedirectStdOut;
    }

    ReporterPreferences ListeningReporter::getPreferences() const { return m_preferences; }

    std::set<Verbosity> ListeningReporter::getSupportedVerbosities() {
        return std::set<Verbosity>{};
    }

    void ListeningReporter::noMatchingTestCases(std::string const& spec) {
        for (auto const& listener : m_listeners) {
            listener->noMatchingTestCases(spec);
        }
        m_reporter->noMatchingTestCases(spec);
    }

    void ListeningReporter::reportInvalidArguments(std::string const& arg) {
        for (auto const& listener : m_listeners) {
            listener->reportInvalidArguments(arg);
        }
        m_reporter->reportInvalidArguments(arg);
    }

#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
    void ListeningReporter::benchmarkPreparing(std::string const& name) {
        for (auto const& listener : m_listeners) {
            listener->benchmarkPreparing(name);
        }
        m_reporter->benchmarkPreparing(name);
    }
    void ListeningReporter::benchmarkStarting(BenchmarkInfo const& benchmarkInfo) {
        for (auto const& listener : m_listeners) {
            listener->benchmarkStarting(benchmarkInfo);
        }
        m_reporter->benchmarkStarting(benchmarkInfo);
    }
    void ListeningReporter::benchmarkEnded(BenchmarkStats<> const& benchmarkStats) {
        for (auto const& listener : m_listeners) {
            listener->benchmarkEnded(benchmarkStats);
        }
        m_reporter->benchmarkEnded(benchmarkStats);
    }

    void ListeningReporter::benchmarkFailed(std::string const& error) {
        for (auto const& listener : m_listeners) {
            listener->benchmarkFailed(error);
        }
        m_reporter->benchmarkFailed(error);
    }
#endif // CATCH_CONFIG_ENABLE_BENCHMARKING

    void ListeningReporter::testRunStarting(TestRunInfo const& testRunInfo) {
        for (auto const& listener : m_listeners) {
            listener->testRunStarting(testRunInfo);
        }
        m_reporter->testRunStarting(testRunInfo);
    }

    void ListeningReporter::testGroupStarting(GroupInfo const& groupInfo) {
        for (auto const& listener : m_listeners) {
            listener->testGroupStarting(groupInfo);
        }
        m_reporter->testGroupStarting(groupInfo);
    }

    void ListeningReporter::testCaseStarting(TestCaseInfo const& testInfo) {
        for (auto const& listener : m_listeners) {
            listener->testCaseStarting(testInfo);
        }
        m_reporter->testCaseStarting(testInfo);
    }

    void ListeningReporter::sectionStarting(SectionInfo const& sectionInfo) {
        for (auto const& listener : m_listeners) {
            listener->sectionStarting(sectionInfo);
        }
        m_reporter->sectionStarting(sectionInfo);
    }

    void ListeningReporter::assertionStarting(AssertionInfo const& assertionInfo) {
        for (auto const& listener : m_listeners) {
            listener->assertionStarting(assertionInfo);
        }
        m_reporter->assertionStarting(assertionInfo);
    }

    // The return value indicates if the messages buffer should be cleared:
    bool ListeningReporter::assertionEnded(AssertionStats const& assertionStats) {
        for (auto const& listener : m_listeners) {
            static_cast<void>(listener->assertionEnded(assertionStats));
        }
        return m_reporter->assertionEnded(assertionStats);
    }

    void ListeningReporter::sectionEnded(SectionStats const& sectionStats) {
        for (auto const& listener : m_listeners) {
            listener->sectionEnded(sectionStats);
        }
        m_reporter->sectionEnded(sectionStats);
    }

    void ListeningReporter::testCaseEnded(TestCaseStats const& testCaseStats) {
        for (auto const& listener : m_listeners) {
            listener->testCaseEnded(testCaseStats);
        }
        m_reporter->testCaseEnded(testCaseStats);
    }

    void ListeningReporter::testGroupEnded(TestGroupStats const& testGroupStats) {
        for (auto const& listener : m_listeners) {
            listener->testGroupEnded(testGroupStats);
        }
        m_reporter->testGroupEnded(testGroupStats);
    }

    void ListeningReporter::testRunEnded(TestRunStats const& testRunStats) {
        for (auto const& listener : m_listeners) {
            listener->testRunEnded(testRunStats);
        }
        m_reporter->testRunEnded(testRunStats);
    }

    void ListeningReporter::skipTest(TestCaseInfo const& testInfo) {
        for (auto const& listener : m_listeners) {
            listener->skipTest(testInfo);
        }
        m_reporter->skipTest(testInfo);
    }

    bool ListeningReporter::isMulti() const { return true; }

} // end namespace Catch
// end catch_reporter_listening.cpp
// start catch_reporter_xml.cpp

#if defined(_MSC_VER)
#pragma warning(push)
#pragma warning(disable : 4061) // Not all labels are EXPLICITLY handled in
                                // switch Note that 4062 (not all labels are
                                // handled and default is missing) is enabled
#endif

namespace Catch {
    XmlReporter::XmlReporter(ReporterConfig const& _config) :
        StreamingReporterBase(_config), m_xml(_config.stream()) {
        m_reporterPrefs.shouldRedirectStdOut = true;
        m_reporterPrefs.shouldReportAllAssertions = true;
    }

    XmlReporter::~XmlReporter() = default;

    std::string XmlReporter::getDescription() { return "Reports test results as an XML document"; }

    std::string XmlReporter::getStylesheetRef() const { return std::string(); }

    void XmlReporter::writeSourceInfo(SourceLineInfo const& sourceInfo) {
        m_xml.writeAttribute("filename", sourceInfo.file).writeAttribute("line", sourceInfo.line);
    }

    void XmlReporter::noMatchingTestCases(std::string const& s) {
        StreamingReporterBase::noMatchingTestCases(s);
    }

    void XmlReporter::testRunStarting(TestRunInfo const& testInfo) {
        StreamingReporterBase::testRunStarting(testInfo);
        std::string stylesheetRef = getStylesheetRef();
        if (!stylesheetRef.empty())
            m_xml.writeStylesheetRef(stylesheetRef);
        m_xml.startElement("Catch");
        if (!m_config->name().empty())
            m_xml.writeAttribute("name", m_config->name());
        if (m_config->testSpec().hasFilters())
            m_xml.writeAttribute("filters", serializeFilters(m_config->getTestsOrTags()));
        if (m_config->rngSeed() != 0)
            m_xml.scopedElement("Randomness").writeAttribute("seed", m_config->rngSeed());
    }

    void XmlReporter::testGroupStarting(GroupInfo const& groupInfo) {
        StreamingReporterBase::testGroupStarting(groupInfo);
        m_xml.startElement("Group").writeAttribute("name", groupInfo.name);
    }

    void XmlReporter::testCaseStarting(TestCaseInfo const& testInfo) {
        StreamingReporterBase::testCaseStarting(testInfo);
        m_xml.startElement("TestCase")
            .writeAttribute("name", trim(testInfo.name))
            .writeAttribute("description", testInfo.description)
            .writeAttribute("tags", testInfo.tagsAsString());

        writeSourceInfo(testInfo.lineInfo);

        if (m_config->showDurations() == ShowDurations::Always)
            m_testCaseTimer.start();
        m_xml.ensureTagClosed();
    }

    void XmlReporter::sectionStarting(SectionInfo const& sectionInfo) {
        StreamingReporterBase::sectionStarting(sectionInfo);
        if (m_sectionDepth++ > 0) {
            m_xml.startElement("Section").writeAttribute("name", trim(sectionInfo.name));
            writeSourceInfo(sectionInfo.lineInfo);
            m_xml.ensureTagClosed();
        }
    }

    void XmlReporter::assertionStarting(AssertionInfo const&) {}

    bool XmlReporter::assertionEnded(AssertionStats const& assertionStats) {

        AssertionResult const& result = assertionStats.assertionResult;

        bool includeResults = m_config->includeSuccessfulResults() || !result.isOk();

        if (includeResults || result.getResultType() == ResultWas::Warning) {
            // Print any info messages in <Info> tags.
            for (auto const& msg : assertionStats.infoMessages) {
                if (msg.type == ResultWas::Info && includeResults) {
                    m_xml.scopedElement("Info").writeText(msg.message);
                } else if (msg.type == ResultWas::Warning) {
                    m_xml.scopedElement("Warning").writeText(msg.message);
                }
            }
        }

        // Drop out if result was successful but we're not printing them.
        if (!includeResults && result.getResultType() != ResultWas::Warning)
            return true;

        // Print the expression if there is one.
        if (result.hasExpression()) {
            m_xml.startElement("Expression")
                .writeAttribute("success", result.succeeded())
                .writeAttribute("type", result.getTestMacroName());

            writeSourceInfo(result.getSourceInfo());

            m_xml.scopedElement("Original").writeText(result.getExpression());
            m_xml.scopedElement("Expanded").writeText(result.getExpandedExpression());
        }

        // And... Print a result applicable to each result type.
        switch (result.getResultType()) {
            case ResultWas::ThrewException:
                m_xml.startElement("Exception");
                writeSourceInfo(result.getSourceInfo());
                m_xml.writeText(result.getMessage());
                m_xml.endElement();
                break;
            case ResultWas::FatalErrorCondition:
                m_xml.startElement("FatalErrorCondition");
                writeSourceInfo(result.getSourceInfo());
                m_xml.writeText(result.getMessage());
                m_xml.endElement();
                break;
            case ResultWas::Info:
                m_xml.scopedElement("Info").writeText(result.getMessage());
                break;
            case ResultWas::Warning:
                // Warning will already have been written
                break;
            case ResultWas::ExplicitFailure:
                m_xml.startElement("Failure");
                writeSourceInfo(result.getSourceInfo());
                m_xml.writeText(result.getMessage());
                m_xml.endElement();
                break;
            default:
                break;
        }

        if (result.hasExpression())
            m_xml.endElement();

        return true;
    }

    void XmlReporter::sectionEnded(SectionStats const& sectionStats) {
        StreamingReporterBase::sectionEnded(sectionStats);
        if (--m_sectionDepth > 0) {
            XmlWriter::ScopedElement e = m_xml.scopedElement("OverallResults");
            e.writeAttribute("successes", sectionStats.assertions.passed);
            e.writeAttribute("failures", sectionStats.assertions.failed);
            e.writeAttribute("expectedFailures", sectionStats.assertions.failedButOk);

            if (m_config->showDurations() == ShowDurations::Always)
                e.writeAttribute("durationInSeconds", sectionStats.durationInSeconds);

            m_xml.endElement();
        }
    }

    void XmlReporter::testCaseEnded(TestCaseStats const& testCaseStats) {
        StreamingReporterBase::testCaseEnded(testCaseStats);
        XmlWriter::ScopedElement e = m_xml.scopedElement("OverallResult");
        e.writeAttribute("success", testCaseStats.totals.assertions.allOk());

        if (m_config->showDurations() == ShowDurations::Always)
            e.writeAttribute("durationInSeconds", m_testCaseTimer.getElapsedSeconds());

        if (!testCaseStats.stdOut.empty())
            m_xml.scopedElement("StdOut").writeText(trim(testCaseStats.stdOut),
                                                    XmlFormatting::Newline);
        if (!testCaseStats.stdErr.empty())
            m_xml.scopedElement("StdErr").writeText(trim(testCaseStats.stdErr),
                                                    XmlFormatting::Newline);

        m_xml.endElement();
    }

    void XmlReporter::testGroupEnded(TestGroupStats const& testGroupStats) {
        StreamingReporterBase::testGroupEnded(testGroupStats);
        // TODO: Check testGroupStats.aborting and act accordingly.
        m_xml.scopedElement("OverallResults")
            .writeAttribute("successes", testGroupStats.totals.assertions.passed)
            .writeAttribute("failures", testGroupStats.totals.assertions.failed)
            .writeAttribute("expectedFailures", testGroupStats.totals.assertions.failedButOk);
        m_xml.scopedElement("OverallResultsCases")
            .writeAttribute("successes", testGroupStats.totals.testCases.passed)
            .writeAttribute("failures", testGroupStats.totals.testCases.failed)
            .writeAttribute("expectedFailures", testGroupStats.totals.testCases.failedButOk);
        m_xml.endElement();
    }

    void XmlReporter::testRunEnded(TestRunStats const& testRunStats) {
        StreamingReporterBase::testRunEnded(testRunStats);
        m_xml.scopedElement("OverallResults")
            .writeAttribute("successes", testRunStats.totals.assertions.passed)
            .writeAttribute("failures", testRunStats.totals.assertions.failed)
            .writeAttribute("expectedFailures", testRunStats.totals.assertions.failedButOk);
        m_xml.scopedElement("OverallResultsCases")
            .writeAttribute("successes", testRunStats.totals.testCases.passed)
            .writeAttribute("failures", testRunStats.totals.testCases.failed)
            .writeAttribute("expectedFailures", testRunStats.totals.testCases.failedButOk);
        m_xml.endElement();
    }

#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
    void XmlReporter::benchmarkPreparing(std::string const& name) {
        m_xml.startElement("BenchmarkResults").writeAttribute("name", name);
    }

    void XmlReporter::benchmarkStarting(BenchmarkInfo const& info) {
        m_xml.writeAttribute("samples", info.samples)
            .writeAttribute("resamples", info.resamples)
            .writeAttribute("iterations", info.iterations)
            .writeAttribute("clockResolution", info.clockResolution)
            .writeAttribute("estimatedDuration", info.estimatedDuration)
            .writeComment("All values in nano seconds");
    }

    void XmlReporter::benchmarkEnded(BenchmarkStats<> const& benchmarkStats) {
        m_xml.startElement("mean")
            .writeAttribute("value", benchmarkStats.mean.point.count())
            .writeAttribute("lowerBound", benchmarkStats.mean.lower_bound.count())
            .writeAttribute("upperBound", benchmarkStats.mean.upper_bound.count())
            .writeAttribute("ci", benchmarkStats.mean.confidence_interval);
        m_xml.endElement();
        m_xml.startElement("standardDeviation")
            .writeAttribute("value", benchmarkStats.standardDeviation.point.count())
            .writeAttribute("lowerBound", benchmarkStats.standardDeviation.lower_bound.count())
            .writeAttribute("upperBound", benchmarkStats.standardDeviation.upper_bound.count())
            .writeAttribute("ci", benchmarkStats.standardDeviation.confidence_interval);
        m_xml.endElement();
        m_xml.startElement("outliers")
            .writeAttribute("variance", benchmarkStats.outlierVariance)
            .writeAttribute("lowMild", benchmarkStats.outliers.low_mild)
            .writeAttribute("lowSevere", benchmarkStats.outliers.low_severe)
            .writeAttribute("highMild", benchmarkStats.outliers.high_mild)
            .writeAttribute("highSevere", benchmarkStats.outliers.high_severe);
        m_xml.endElement();
        m_xml.endElement();
    }

    void XmlReporter::benchmarkFailed(std::string const& error) {
        m_xml.scopedElement("failed").writeAttribute("message", error);
        m_xml.endElement();
    }
#endif // CATCH_CONFIG_ENABLE_BENCHMARKING

    CATCH_REGISTER_REPORTER("xml", XmlReporter)

} // end namespace Catch

#if defined(_MSC_VER)
#pragma warning(pop)
#endif
// end catch_reporter_xml.cpp

namespace Catch {
    LeakDetector leakDetector;
}

#ifdef __clang__
#pragma clang diagnostic pop
#endif

// end catch_impl.hpp
#endif

#ifdef CATCH_CONFIG_MAIN
// start catch_default_main.hpp

#ifndef __OBJC__

#if defined(CATCH_CONFIG_WCHAR) && defined(CATCH_PLATFORM_WINDOWS) && defined(_UNICODE) &&         \
    !defined(DO_NOT_USE_WMAIN)
// Standard C/C++ Win32 Unicode wmain entry point
extern "C" int wmain(int argc, wchar_t* argv[], wchar_t*[]) {
#else
// Standard C/C++ main entry point
int main(int argc, char* argv[]) {
#endif

    return Catch::Session().run(argc, argv);
}

#else // __OBJC__

// Objective-C entry point
int main(int argc, char* const argv[]) {
#if !CATCH_ARC_ENABLED
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
#endif

    Catch::registerTestMethods();
    int result = Catch::Session().run(argc, (char**)argv);

#if !CATCH_ARC_ENABLED
    [pool drain];
#endif

    return result;
}

#endif // __OBJC__

// end catch_default_main.hpp
#endif

#if !defined(CATCH_CONFIG_IMPL_ONLY)

#ifdef CLARA_CONFIG_MAIN_NOT_DEFINED
#undef CLARA_CONFIG_MAIN
#endif

#if !defined(CATCH_CONFIG_DISABLE)
//////
// If this config identifier is defined then all CATCH macros are prefixed with
// CATCH_
#ifdef CATCH_CONFIG_PREFIX_ALL

#define CATCH_REQUIRE(...)                                                                         \
    INTERNAL_CATCH_TEST("CATCH_REQUIRE", Catch::ResultDisposition::Normal, __VA_ARGS__)
#define CATCH_REQUIRE_FALSE(...)                                                                   \
    INTERNAL_CATCH_TEST("CATCH_REQUIRE_FALSE",                                                     \
                        Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest,    \
                        __VA_ARGS__)

#define CATCH_REQUIRE_THROWS(...)                                                                  \
    INTERNAL_CATCH_THROWS("CATCH_REQUIRE_THROWS", Catch::ResultDisposition::Normal, __VA_ARGS__)
#define CATCH_REQUIRE_THROWS_AS(expr, exceptionType)                                               \
    INTERNAL_CATCH_THROWS_AS(                                                                      \
        "CATCH_REQUIRE_THROWS_AS", exceptionType, Catch::ResultDisposition::Normal, expr)
#define CATCH_REQUIRE_THROWS_WITH(expr, matcher)                                                   \
    INTERNAL_CATCH_THROWS_STR_MATCHES(                                                             \
        "CATCH_REQUIRE_THROWS_WITH", Catch::ResultDisposition::Normal, matcher, expr)
#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
#define CATCH_REQUIRE_THROWS_MATCHES(expr, exceptionType, matcher)                                 \
    INTERNAL_CATCH_THROWS_MATCHES("CATCH_REQUIRE_THROWS_MATCHES",                                  \
                                  exceptionType,                                                   \
                                  Catch::ResultDisposition::Normal,                                \
                                  matcher,                                                         \
                                  expr)
#endif // CATCH_CONFIG_DISABLE_MATCHERS
#define CATCH_REQUIRE_NOTHROW(...)                                                                 \
    INTERNAL_CATCH_NO_THROW("CATCH_REQUIRE_NOTHROW", Catch::ResultDisposition::Normal, __VA_ARGS__)

#define CATCH_CHECK(...)                                                                           \
    INTERNAL_CATCH_TEST("CATCH_CHECK", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__)
#define CATCH_CHECK_FALSE(...)                                                                     \
    INTERNAL_CATCH_TEST("CATCH_CHECK_FALSE",                                                       \
                        Catch::ResultDisposition::ContinueOnFailure |                              \
                            Catch::ResultDisposition::FalseTest,                                   \
                        __VA_ARGS__)
#define CATCH_CHECKED_IF(...)                                                                      \
    INTERNAL_CATCH_IF("CATCH_CHECKED_IF", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__)
#define CATCH_CHECKED_ELSE(...)                                                                    \
    INTERNAL_CATCH_ELSE(                                                                           \
        "CATCH_CHECKED_ELSE", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__)
#define CATCH_CHECK_NOFAIL(...)                                                                    \
    INTERNAL_CATCH_TEST("CATCH_CHECK_NOFAIL",                                                      \
                        Catch::ResultDisposition::ContinueOnFailure |                              \
                            Catch::ResultDisposition::SuppressFail,                                \
                        __VA_ARGS__)

#define CATCH_CHECK_THROWS(...)                                                                    \
    INTERNAL_CATCH_THROWS(                                                                         \
        "CATCH_CHECK_THROWS", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__)
#define CATCH_CHECK_THROWS_AS(expr, exceptionType)                                                 \
    INTERNAL_CATCH_THROWS_AS(                                                                      \
        "CATCH_CHECK_THROWS_AS", exceptionType, Catch::ResultDisposition::ContinueOnFailure, expr)
#define CATCH_CHECK_THROWS_WITH(expr, matcher)                                                     \
    INTERNAL_CATCH_THROWS_STR_MATCHES(                                                             \
        "CATCH_CHECK_THROWS_WITH", Catch::ResultDisposition::ContinueOnFailure, matcher, expr)
#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
#define CATCH_CHECK_THROWS_MATCHES(expr, exceptionType, matcher)                                   \
    INTERNAL_CATCH_THROWS_MATCHES("CATCH_CHECK_THROWS_MATCHES",                                    \
                                  exceptionType,                                                   \
                                  Catch::ResultDisposition::ContinueOnFailure,                     \
                                  matcher,                                                         \
                                  expr)
#endif // CATCH_CONFIG_DISABLE_MATCHERS
#define CATCH_CHECK_NOTHROW(...)                                                                   \
    INTERNAL_CATCH_NO_THROW(                                                                       \
        "CATCH_CHECK_NOTHROW", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__)

#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
#define CATCH_CHECK_THAT(arg, matcher)                                                             \
    INTERNAL_CHECK_THAT(                                                                           \
        "CATCH_CHECK_THAT", matcher, Catch::ResultDisposition::ContinueOnFailure, arg)

#define CATCH_REQUIRE_THAT(arg, matcher)                                                           \
    INTERNAL_CHECK_THAT("CATCH_REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg)
#endif // CATCH_CONFIG_DISABLE_MATCHERS

#define CATCH_INFO(msg) INTERNAL_CATCH_INFO("CATCH_INFO", msg)
#define CATCH_UNSCOPED_INFO(msg) INTERNAL_CATCH_UNSCOPED_INFO("CATCH_UNSCOPED_INFO", msg)
#define CATCH_WARN(msg)                                                                            \
    INTERNAL_CATCH_MSG(                                                                            \
        "CATCH_WARN", Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, msg)
#define CATCH_CAPTURE(...)                                                                         \
    INTERNAL_CATCH_CAPTURE(INTERNAL_CATCH_UNIQUE_NAME(capturer), "CATCH_CAPTURE", __VA_ARGS__)

#define CATCH_TEST_CASE(...) INTERNAL_CATCH_TESTCASE(__VA_ARGS__)
#define CATCH_TEST_CASE_METHOD(className, ...)                                                     \
    INTERNAL_CATCH_TEST_CASE_METHOD(className, __VA_ARGS__)
#define CATCH_METHOD_AS_TEST_CASE(method, ...)                                                     \
    INTERNAL_CATCH_METHOD_AS_TEST_CASE(method, __VA_ARGS__)
#define CATCH_REGISTER_TEST_CASE(Function, ...)                                                    \
    INTERNAL_CATCH_REGISTER_TESTCASE(Function, __VA_ARGS__)
#define CATCH_SECTION(...) INTERNAL_CATCH_SECTION(__VA_ARGS__)
#define CATCH_DYNAMIC_SECTION(...) INTERNAL_CATCH_DYNAMIC_SECTION(__VA_ARGS__)
#define CATCH_FAIL(...)                                                                            \
    INTERNAL_CATCH_MSG("CATCH_FAIL",                                                               \
                       Catch::ResultWas::ExplicitFailure,                                          \
                       Catch::ResultDisposition::Normal,                                           \
                       __VA_ARGS__)
#define CATCH_FAIL_CHECK(...)                                                                      \
    INTERNAL_CATCH_MSG("CATCH_FAIL_CHECK",                                                         \
                       Catch::ResultWas::ExplicitFailure,                                          \
                       Catch::ResultDisposition::ContinueOnFailure,                                \
                       __VA_ARGS__)
#define CATCH_SUCCEED(...)                                                                         \
    INTERNAL_CATCH_MSG("CATCH_SUCCEED",                                                            \
                       Catch::ResultWas::Ok,                                                       \
                       Catch::ResultDisposition::ContinueOnFailure,                                \
                       __VA_ARGS__)

#define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE()

#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define CATCH_TEMPLATE_TEST_CASE(...) INTERNAL_CATCH_TEMPLATE_TEST_CASE(__VA_ARGS__)
#define CATCH_TEMPLATE_TEST_CASE_SIG(...) INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG(__VA_ARGS__)
#define CATCH_TEMPLATE_TEST_CASE_METHOD(className, ...)                                            \
    INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD(className, __VA_ARGS__)
#define CATCH_TEMPLATE_TEST_CASE_METHOD_SIG(className, ...)                                        \
    INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG(className, __VA_ARGS__)
#define CATCH_TEMPLATE_PRODUCT_TEST_CASE(...) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE(__VA_ARGS__)
#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG(...)                                                  \
    INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG(__VA_ARGS__)
#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD(className, ...)                                    \
    INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD(className, __VA_ARGS__)
#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG(className, ...)                                \
    INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG(className, __VA_ARGS__)
#else
#define CATCH_TEMPLATE_TEST_CASE(...)                                                              \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_TEST_CASE(__VA_ARGS__))
#define CATCH_TEMPLATE_TEST_CASE_SIG(...)                                                          \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG(__VA_ARGS__))
#define CATCH_TEMPLATE_TEST_CASE_METHOD(className, ...)                                            \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD(className, __VA_ARGS__))
#define CATCH_TEMPLATE_TEST_CASE_METHOD_SIG(className, ...)                                        \
    INTERNAL_CATCH_EXPAND_VARGS(                                                                   \
        INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG(className, __VA_ARGS__))
#define CATCH_TEMPLATE_PRODUCT_TEST_CASE(...)                                                      \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE(__VA_ARGS__))
#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG(...)                                                  \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG(__VA_ARGS__))
#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD(className, ...)                                    \
    INTERNAL_CATCH_EXPAND_VARGS(                                                                   \
        INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD(className, __VA_ARGS__))
#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG(className, ...)                                \
    INTERNAL_CATCH_EXPAND_VARGS(                                                                   \
        INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG(className, __VA_ARGS__))
#endif

#if !defined(CATCH_CONFIG_RUNTIME_STATIC_REQUIRE)
#define CATCH_STATIC_REQUIRE(...)                                                                  \
    static_assert(__VA_ARGS__, #__VA_ARGS__);                                                      \
    CATCH_SUCCEED(#__VA_ARGS__)
#define CATCH_STATIC_REQUIRE_FALSE(...)                                                            \
    static_assert(!(__VA_ARGS__), "!(" #__VA_ARGS__ ")");                                          \
    CATCH_SUCCEED(#__VA_ARGS__)
#else
#define CATCH_STATIC_REQUIRE(...) CATCH_REQUIRE(__VA_ARGS__)
#define CATCH_STATIC_REQUIRE_FALSE(...) CATCH_REQUIRE_FALSE(__VA_ARGS__)
#endif

// "BDD-style" convenience wrappers
#define CATCH_SCENARIO(...) CATCH_TEST_CASE("Scenario: " __VA_ARGS__)
#define CATCH_SCENARIO_METHOD(className, ...)                                                      \
    INTERNAL_CATCH_TEST_CASE_METHOD(className, "Scenario: " __VA_ARGS__)
#define CATCH_GIVEN(desc) INTERNAL_CATCH_DYNAMIC_SECTION("    Given: " << desc)
#define CATCH_AND_GIVEN(desc) INTERNAL_CATCH_DYNAMIC_SECTION("And given: " << desc)
#define CATCH_WHEN(desc) INTERNAL_CATCH_DYNAMIC_SECTION("     When: " << desc)
#define CATCH_AND_WHEN(desc) INTERNAL_CATCH_DYNAMIC_SECTION(" And when: " << desc)
#define CATCH_THEN(desc) INTERNAL_CATCH_DYNAMIC_SECTION("     Then: " << desc)
#define CATCH_AND_THEN(desc) INTERNAL_CATCH_DYNAMIC_SECTION("      And: " << desc)

#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
#define CATCH_BENCHMARK(...)                                                                       \
    INTERNAL_CATCH_BENCHMARK(INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____B_E_N_C_H____),           \
                             INTERNAL_CATCH_GET_1_ARG(__VA_ARGS__, , ),                            \
                             INTERNAL_CATCH_GET_2_ARG(__VA_ARGS__, , ))
#define CATCH_BENCHMARK_ADVANCED(name)                                                             \
    INTERNAL_CATCH_BENCHMARK_ADVANCED(INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____B_E_N_C_H____),  \
                                      name)
#endif // CATCH_CONFIG_ENABLE_BENCHMARKING

// If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not
// required
#else

#define REQUIRE(...) INTERNAL_CATCH_TEST("REQUIRE", Catch::ResultDisposition::Normal, __VA_ARGS__)
#define REQUIRE_FALSE(...)                                                                         \
    INTERNAL_CATCH_TEST("REQUIRE_FALSE",                                                           \
                        Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest,    \
                        __VA_ARGS__)

#define REQUIRE_THROWS(...)                                                                        \
    INTERNAL_CATCH_THROWS("REQUIRE_THROWS", Catch::ResultDisposition::Normal, __VA_ARGS__)
#define REQUIRE_THROWS_AS(expr, exceptionType)                                                     \
    INTERNAL_CATCH_THROWS_AS(                                                                      \
        "REQUIRE_THROWS_AS", exceptionType, Catch::ResultDisposition::Normal, expr)
#define REQUIRE_THROWS_WITH(expr, matcher)                                                         \
    INTERNAL_CATCH_THROWS_STR_MATCHES(                                                             \
        "REQUIRE_THROWS_WITH", Catch::ResultDisposition::Normal, matcher, expr)
#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
#define REQUIRE_THROWS_MATCHES(expr, exceptionType, matcher)                                       \
    INTERNAL_CATCH_THROWS_MATCHES(                                                                 \
        "REQUIRE_THROWS_MATCHES", exceptionType, Catch::ResultDisposition::Normal, matcher, expr)
#endif // CATCH_CONFIG_DISABLE_MATCHERS
#define REQUIRE_NOTHROW(...)                                                                       \
    INTERNAL_CATCH_NO_THROW("REQUIRE_NOTHROW", Catch::ResultDisposition::Normal, __VA_ARGS__)

#define CHECK(...)                                                                                 \
    INTERNAL_CATCH_TEST("CHECK", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__)
#define CHECK_FALSE(...)                                                                           \
    INTERNAL_CATCH_TEST("CHECK_FALSE",                                                             \
                        Catch::ResultDisposition::ContinueOnFailure |                              \
                            Catch::ResultDisposition::FalseTest,                                   \
                        __VA_ARGS__)
#define CHECKED_IF(...)                                                                            \
    INTERNAL_CATCH_IF("CHECKED_IF", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__)
#define CHECKED_ELSE(...)                                                                          \
    INTERNAL_CATCH_ELSE("CHECKED_ELSE", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__)
#define CHECK_NOFAIL(...)                                                                          \
    INTERNAL_CATCH_TEST("CHECK_NOFAIL",                                                            \
                        Catch::ResultDisposition::ContinueOnFailure |                              \
                            Catch::ResultDisposition::SuppressFail,                                \
                        __VA_ARGS__)

#define CHECK_THROWS(...)                                                                          \
    INTERNAL_CATCH_THROWS("CHECK_THROWS", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__)
#define CHECK_THROWS_AS(expr, exceptionType)                                                       \
    INTERNAL_CATCH_THROWS_AS(                                                                      \
        "CHECK_THROWS_AS", exceptionType, Catch::ResultDisposition::ContinueOnFailure, expr)
#define CHECK_THROWS_WITH(expr, matcher)                                                           \
    INTERNAL_CATCH_THROWS_STR_MATCHES(                                                             \
        "CHECK_THROWS_WITH", Catch::ResultDisposition::ContinueOnFailure, matcher, expr)
#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
#define CHECK_THROWS_MATCHES(expr, exceptionType, matcher)                                         \
    INTERNAL_CATCH_THROWS_MATCHES("CHECK_THROWS_MATCHES",                                          \
                                  exceptionType,                                                   \
                                  Catch::ResultDisposition::ContinueOnFailure,                     \
                                  matcher,                                                         \
                                  expr)
#endif // CATCH_CONFIG_DISABLE_MATCHERS
#define CHECK_NOTHROW(...)                                                                         \
    INTERNAL_CATCH_NO_THROW(                                                                       \
        "CHECK_NOTHROW", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__)

#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
#define CHECK_THAT(arg, matcher)                                                                   \
    INTERNAL_CHECK_THAT("CHECK_THAT", matcher, Catch::ResultDisposition::ContinueOnFailure, arg)

#define REQUIRE_THAT(arg, matcher)                                                                 \
    INTERNAL_CHECK_THAT("REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg)
#endif // CATCH_CONFIG_DISABLE_MATCHERS

#define INFO(msg) INTERNAL_CATCH_INFO("INFO", msg)
#define UNSCOPED_INFO(msg) INTERNAL_CATCH_UNSCOPED_INFO("UNSCOPED_INFO", msg)
#define WARN(msg)                                                                                  \
    INTERNAL_CATCH_MSG(                                                                            \
        "WARN", Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, msg)
#define CAPTURE(...)                                                                               \
    INTERNAL_CATCH_CAPTURE(INTERNAL_CATCH_UNIQUE_NAME(capturer), "CAPTURE", __VA_ARGS__)

#define TEST_CASE(...) INTERNAL_CATCH_TESTCASE(__VA_ARGS__)
#define TEST_CASE_METHOD(className, ...) INTERNAL_CATCH_TEST_CASE_METHOD(className, __VA_ARGS__)
#define METHOD_AS_TEST_CASE(method, ...) INTERNAL_CATCH_METHOD_AS_TEST_CASE(method, __VA_ARGS__)
#define REGISTER_TEST_CASE(Function, ...) INTERNAL_CATCH_REGISTER_TESTCASE(Function, __VA_ARGS__)
#define SECTION(...) INTERNAL_CATCH_SECTION(__VA_ARGS__)
#define DYNAMIC_SECTION(...) INTERNAL_CATCH_DYNAMIC_SECTION(__VA_ARGS__)
#define FAIL(...)                                                                                  \
    INTERNAL_CATCH_MSG(                                                                            \
        "FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, __VA_ARGS__)
#define FAIL_CHECK(...)                                                                            \
    INTERNAL_CATCH_MSG("FAIL_CHECK",                                                               \
                       Catch::ResultWas::ExplicitFailure,                                          \
                       Catch::ResultDisposition::ContinueOnFailure,                                \
                       __VA_ARGS__)
#define SUCCEED(...)                                                                               \
    INTERNAL_CATCH_MSG(                                                                            \
        "SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__)
#define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE()

#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define TEMPLATE_TEST_CASE(...) INTERNAL_CATCH_TEMPLATE_TEST_CASE(__VA_ARGS__)
#define TEMPLATE_TEST_CASE_SIG(...) INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG(__VA_ARGS__)
#define TEMPLATE_TEST_CASE_METHOD(className, ...)                                                  \
    INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD(className, __VA_ARGS__)
#define TEMPLATE_TEST_CASE_METHOD_SIG(className, ...)                                              \
    INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG(className, __VA_ARGS__)
#define TEMPLATE_PRODUCT_TEST_CASE(...) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE(__VA_ARGS__)
#define TEMPLATE_PRODUCT_TEST_CASE_SIG(...)                                                        \
    INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG(__VA_ARGS__)
#define TEMPLATE_PRODUCT_TEST_CASE_METHOD(className, ...)                                          \
    INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD(className, __VA_ARGS__)
#define TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG(className, ...)                                      \
    INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG(className, __VA_ARGS__)
#define TEMPLATE_LIST_TEST_CASE(...) INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE(__VA_ARGS__)
#define TEMPLATE_LIST_TEST_CASE_METHOD(className, ...)                                             \
    INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD(className, __VA_ARGS__)
#else
#define TEMPLATE_TEST_CASE(...)                                                                    \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_TEST_CASE(__VA_ARGS__))
#define TEMPLATE_TEST_CASE_SIG(...)                                                                \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG(__VA_ARGS__))
#define TEMPLATE_TEST_CASE_METHOD(className, ...)                                                  \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD(className, __VA_ARGS__))
#define TEMPLATE_TEST_CASE_METHOD_SIG(className, ...)                                              \
    INTERNAL_CATCH_EXPAND_VARGS(                                                                   \
        INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG(className, __VA_ARGS__))
#define TEMPLATE_PRODUCT_TEST_CASE(...)                                                            \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE(__VA_ARGS__))
#define TEMPLATE_PRODUCT_TEST_CASE_SIG(...)                                                        \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG(__VA_ARGS__))
#define TEMPLATE_PRODUCT_TEST_CASE_METHOD(className, ...)                                          \
    INTERNAL_CATCH_EXPAND_VARGS(                                                                   \
        INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD(className, __VA_ARGS__))
#define TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG(className, ...)                                      \
    INTERNAL_CATCH_EXPAND_VARGS(                                                                   \
        INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG(className, __VA_ARGS__))
#define TEMPLATE_LIST_TEST_CASE(...)                                                               \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE(__VA_ARGS__))
#define TEMPLATE_LIST_TEST_CASE_METHOD(className, ...)                                             \
    INTERNAL_CATCH_EXPAND_VARGS(                                                                   \
        INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD(className, __VA_ARGS__))
#endif

#if !defined(CATCH_CONFIG_RUNTIME_STATIC_REQUIRE)
#define STATIC_REQUIRE(...)                                                                        \
    static_assert(__VA_ARGS__, #__VA_ARGS__);                                                      \
    SUCCEED(#__VA_ARGS__)
#define STATIC_REQUIRE_FALSE(...)                                                                  \
    static_assert(!(__VA_ARGS__), "!(" #__VA_ARGS__ ")");                                          \
    SUCCEED("!(" #__VA_ARGS__ ")")
#else
#define STATIC_REQUIRE(...) REQUIRE(__VA_ARGS__)
#define STATIC_REQUIRE_FALSE(...) REQUIRE_FALSE(__VA_ARGS__)
#endif

#endif

#define CATCH_TRANSLATE_EXCEPTION(signature) INTERNAL_CATCH_TRANSLATE_EXCEPTION(signature)

// "BDD-style" convenience wrappers
#define SCENARIO(...) TEST_CASE("Scenario: " __VA_ARGS__)
#define SCENARIO_METHOD(className, ...)                                                            \
    INTERNAL_CATCH_TEST_CASE_METHOD(className, "Scenario: " __VA_ARGS__)

#define GIVEN(desc) INTERNAL_CATCH_DYNAMIC_SECTION("    Given: " << desc)
#define AND_GIVEN(desc) INTERNAL_CATCH_DYNAMIC_SECTION("And given: " << desc)
#define WHEN(desc) INTERNAL_CATCH_DYNAMIC_SECTION("     When: " << desc)
#define AND_WHEN(desc) INTERNAL_CATCH_DYNAMIC_SECTION(" And when: " << desc)
#define THEN(desc) INTERNAL_CATCH_DYNAMIC_SECTION("     Then: " << desc)
#define AND_THEN(desc) INTERNAL_CATCH_DYNAMIC_SECTION("      And: " << desc)

#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
#define BENCHMARK(...)                                                                             \
    INTERNAL_CATCH_BENCHMARK(INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____B_E_N_C_H____),           \
                             INTERNAL_CATCH_GET_1_ARG(__VA_ARGS__, , ),                            \
                             INTERNAL_CATCH_GET_2_ARG(__VA_ARGS__, , ))
#define BENCHMARK_ADVANCED(name)                                                                   \
    INTERNAL_CATCH_BENCHMARK_ADVANCED(INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____B_E_N_C_H____),  \
                                      name)
#endif // CATCH_CONFIG_ENABLE_BENCHMARKING

using Catch::Detail::Approx;

#else // CATCH_CONFIG_DISABLE

//////
// If this config identifier is defined then all CATCH macros are prefixed with
// CATCH_
#ifdef CATCH_CONFIG_PREFIX_ALL

#define CATCH_REQUIRE(...) (void)(0)
#define CATCH_REQUIRE_FALSE(...) (void)(0)

#define CATCH_REQUIRE_THROWS(...) (void)(0)
#define CATCH_REQUIRE_THROWS_AS(expr, exceptionType) (void)(0)
#define CATCH_REQUIRE_THROWS_WITH(expr, matcher) (void)(0)
#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
#define CATCH_REQUIRE_THROWS_MATCHES(expr, exceptionType, matcher) (void)(0)
#endif // CATCH_CONFIG_DISABLE_MATCHERS
#define CATCH_REQUIRE_NOTHROW(...) (void)(0)

#define CATCH_CHECK(...) (void)(0)
#define CATCH_CHECK_FALSE(...) (void)(0)
#define CATCH_CHECKED_IF(...) if (__VA_ARGS__)
#define CATCH_CHECKED_ELSE(...) if (!(__VA_ARGS__))
#define CATCH_CHECK_NOFAIL(...) (void)(0)

#define CATCH_CHECK_THROWS(...) (void)(0)
#define CATCH_CHECK_THROWS_AS(expr, exceptionType) (void)(0)
#define CATCH_CHECK_THROWS_WITH(expr, matcher) (void)(0)
#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
#define CATCH_CHECK_THROWS_MATCHES(expr, exceptionType, matcher) (void)(0)
#endif // CATCH_CONFIG_DISABLE_MATCHERS
#define CATCH_CHECK_NOTHROW(...) (void)(0)

#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
#define CATCH_CHECK_THAT(arg, matcher) (void)(0)

#define CATCH_REQUIRE_THAT(arg, matcher) (void)(0)
#endif // CATCH_CONFIG_DISABLE_MATCHERS

#define CATCH_INFO(msg) (void)(0)
#define CATCH_UNSCOPED_INFO(msg) (void)(0)
#define CATCH_WARN(msg) (void)(0)
#define CATCH_CAPTURE(msg) (void)(0)

#define CATCH_TEST_CASE(...)                                                                       \
    INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(                                                       \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_S_T____))
#define CATCH_TEST_CASE_METHOD(className, ...)                                                     \
    INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(                                                       \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_S_T____))
#define CATCH_METHOD_AS_TEST_CASE(method, ...)
#define CATCH_REGISTER_TEST_CASE(Function, ...) (void)(0)
#define CATCH_SECTION(...)
#define CATCH_DYNAMIC_SECTION(...)
#define CATCH_FAIL(...) (void)(0)
#define CATCH_FAIL_CHECK(...) (void)(0)
#define CATCH_SUCCEED(...) (void)(0)

#define CATCH_ANON_TEST_CASE()                                                                     \
    INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(                                                       \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_S_T____))

#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define CATCH_TEMPLATE_TEST_CASE(...) INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(__VA_ARGS__)
#define CATCH_TEMPLATE_TEST_CASE_SIG(...)                                                          \
    INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(__VA_ARGS__)
#define CATCH_TEMPLATE_TEST_CASE_METHOD(className, ...)                                            \
    INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION(className, __VA_ARGS__)
#define CATCH_TEMPLATE_TEST_CASE_METHOD_SIG(className, ...)                                        \
    INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION(className, __VA_ARGS__)
#define CATCH_TEMPLATE_PRODUCT_TEST_CASE(...) CATCH_TEMPLATE_TEST_CASE(__VA_ARGS__)
#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG(...) CATCH_TEMPLATE_TEST_CASE(__VA_ARGS__)
#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD(className, ...)                                    \
    CATCH_TEMPLATE_TEST_CASE_METHOD(className, __VA_ARGS__)
#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG(className, ...)                                \
    CATCH_TEMPLATE_TEST_CASE_METHOD(className, __VA_ARGS__)
#else
#define CATCH_TEMPLATE_TEST_CASE(...)                                                              \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(__VA_ARGS__))
#define CATCH_TEMPLATE_TEST_CASE_SIG(...)                                                          \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(__VA_ARGS__))
#define CATCH_TEMPLATE_TEST_CASE_METHOD(className, ...)                                            \
    INTERNAL_CATCH_EXPAND_VARGS(                                                                   \
        INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION(className, __VA_ARGS__))
#define CATCH_TEMPLATE_TEST_CASE_METHOD_SIG(className, ...)                                        \
    INTERNAL_CATCH_EXPAND_VARGS(                                                                   \
        INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION(className, __VA_ARGS__))
#define CATCH_TEMPLATE_PRODUCT_TEST_CASE(...) CATCH_TEMPLATE_TEST_CASE(__VA_ARGS__)
#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG(...) CATCH_TEMPLATE_TEST_CASE(__VA_ARGS__)
#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD(className, ...)                                    \
    CATCH_TEMPLATE_TEST_CASE_METHOD(className, __VA_ARGS__)
#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG(className, ...)                                \
    CATCH_TEMPLATE_TEST_CASE_METHOD(className, __VA_ARGS__)
#endif

// "BDD-style" convenience wrappers
#define CATCH_SCENARIO(...)                                                                        \
    INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(                                                       \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_S_T____))
#define CATCH_SCENARIO_METHOD(className, ...)                                                      \
    INTERNAL_CATCH_TESTCASE_METHOD_NO_REGISTRATION(                                                \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_S_T____), className)
#define CATCH_GIVEN(desc)
#define CATCH_AND_GIVEN(desc)
#define CATCH_WHEN(desc)
#define CATCH_AND_WHEN(desc)
#define CATCH_THEN(desc)
#define CATCH_AND_THEN(desc)

#define CATCH_STATIC_REQUIRE(...) (void)(0)
#define CATCH_STATIC_REQUIRE_FALSE(...) (void)(0)

// If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not
// required
#else

#define REQUIRE(...) (void)(0)
#define REQUIRE_FALSE(...) (void)(0)

#define REQUIRE_THROWS(...) (void)(0)
#define REQUIRE_THROWS_AS(expr, exceptionType) (void)(0)
#define REQUIRE_THROWS_WITH(expr, matcher) (void)(0)
#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
#define REQUIRE_THROWS_MATCHES(expr, exceptionType, matcher) (void)(0)
#endif // CATCH_CONFIG_DISABLE_MATCHERS
#define REQUIRE_NOTHROW(...) (void)(0)

#define CHECK(...) (void)(0)
#define CHECK_FALSE(...) (void)(0)
#define CHECKED_IF(...) if (__VA_ARGS__)
#define CHECKED_ELSE(...) if (!(__VA_ARGS__))
#define CHECK_NOFAIL(...) (void)(0)

#define CHECK_THROWS(...) (void)(0)
#define CHECK_THROWS_AS(expr, exceptionType) (void)(0)
#define CHECK_THROWS_WITH(expr, matcher) (void)(0)
#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
#define CHECK_THROWS_MATCHES(expr, exceptionType, matcher) (void)(0)
#endif // CATCH_CONFIG_DISABLE_MATCHERS
#define CHECK_NOTHROW(...) (void)(0)

#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
#define CHECK_THAT(arg, matcher) (void)(0)

#define REQUIRE_THAT(arg, matcher) (void)(0)
#endif // CATCH_CONFIG_DISABLE_MATCHERS

#define INFO(msg) (void)(0)
#define UNSCOPED_INFO(msg) (void)(0)
#define WARN(msg) (void)(0)
#define CAPTURE(msg) (void)(0)

#define TEST_CASE(...)                                                                             \
    INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(                                                       \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_S_T____))
#define TEST_CASE_METHOD(className, ...)                                                           \
    INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(                                                       \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_S_T____))
#define METHOD_AS_TEST_CASE(method, ...)
#define REGISTER_TEST_CASE(Function, ...) (void)(0)
#define SECTION(...)
#define DYNAMIC_SECTION(...)
#define FAIL(...) (void)(0)
#define FAIL_CHECK(...) (void)(0)
#define SUCCEED(...) (void)(0)
#define ANON_TEST_CASE()                                                                           \
    INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(                                                       \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_S_T____))

#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define TEMPLATE_TEST_CASE(...) INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(__VA_ARGS__)
#define TEMPLATE_TEST_CASE_SIG(...)                                                                \
    INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(__VA_ARGS__)
#define TEMPLATE_TEST_CASE_METHOD(className, ...)                                                  \
    INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION(className, __VA_ARGS__)
#define TEMPLATE_TEST_CASE_METHOD_SIG(className, ...)                                              \
    INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION(className, __VA_ARGS__)
#define TEMPLATE_PRODUCT_TEST_CASE(...) TEMPLATE_TEST_CASE(__VA_ARGS__)
#define TEMPLATE_PRODUCT_TEST_CASE_SIG(...) TEMPLATE_TEST_CASE(__VA_ARGS__)
#define TEMPLATE_PRODUCT_TEST_CASE_METHOD(className, ...)                                          \
    TEMPLATE_TEST_CASE_METHOD(className, __VA_ARGS__)
#define TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG(className, ...)                                      \
    TEMPLATE_TEST_CASE_METHOD(className, __VA_ARGS__)
#else
#define TEMPLATE_TEST_CASE(...)                                                                    \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(__VA_ARGS__))
#define TEMPLATE_TEST_CASE_SIG(...)                                                                \
    INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(__VA_ARGS__))
#define TEMPLATE_TEST_CASE_METHOD(className, ...)                                                  \
    INTERNAL_CATCH_EXPAND_VARGS(                                                                   \
        INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION(className, __VA_ARGS__))
#define TEMPLATE_TEST_CASE_METHOD_SIG(className, ...)                                              \
    INTERNAL_CATCH_EXPAND_VARGS(                                                                   \
        INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION(className, __VA_ARGS__))
#define TEMPLATE_PRODUCT_TEST_CASE(...) TEMPLATE_TEST_CASE(__VA_ARGS__)
#define TEMPLATE_PRODUCT_TEST_CASE_SIG(...) TEMPLATE_TEST_CASE(__VA_ARGS__)
#define TEMPLATE_PRODUCT_TEST_CASE_METHOD(className, ...)                                          \
    TEMPLATE_TEST_CASE_METHOD(className, __VA_ARGS__)
#define TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG(className, ...)                                      \
    TEMPLATE_TEST_CASE_METHOD(className, __VA_ARGS__)
#endif

#define STATIC_REQUIRE(...) (void)(0)
#define STATIC_REQUIRE_FALSE(...) (void)(0)

#endif

#define CATCH_TRANSLATE_EXCEPTION(signature)                                                       \
    INTERNAL_CATCH_TRANSLATE_EXCEPTION_NO_REG(                                                     \
        INTERNAL_CATCH_UNIQUE_NAME(catch_internal_ExceptionTranslator), signature)

// "BDD-style" convenience wrappers
#define SCENARIO(...)                                                                              \
    INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(                                                       \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_S_T____))
#define SCENARIO_METHOD(className, ...)                                                            \
    INTERNAL_CATCH_TESTCASE_METHOD_NO_REGISTRATION(                                                \
        INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____T_E_S_T____), className)

#define GIVEN(desc)
#define AND_GIVEN(desc)
#define WHEN(desc)
#define AND_WHEN(desc)
#define THEN(desc)
#define AND_THEN(desc)

using Catch::Detail::Approx;

#endif

#endif // ! CATCH_CONFIG_IMPL_ONLY

// start catch_reenable_warnings.h

#ifdef __clang__
#ifdef __ICC // icpc defines the __clang__ macro
#pragma warning(pop)
#else
#pragma clang diagnostic pop
#endif
#elif defined __GNUC__
#pragma GCC diagnostic pop
#endif

// end catch_reenable_warnings.h
// end catch.hpp
#endif // TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED
