// -*- C++ -*-
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef _LIBCPP_REGEX
#define _LIBCPP_REGEX

/*
    regex synopsis

#include <compare>
#include <initializer_list>

namespace std
{

namespace regex_constants
{

enum syntax_option_type
{
    icase      = unspecified,
    nosubs     = unspecified,
    optimize   = unspecified,
    collate    = unspecified,
    ECMAScript = unspecified,
    basic      = unspecified,
    extended   = unspecified,
    awk        = unspecified,
    grep       = unspecified,
    egrep      = unspecified,
    multiline  = unspecified
};

constexpr syntax_option_type operator~(syntax_option_type f);
constexpr syntax_option_type operator&(syntax_option_type lhs, syntax_option_type rhs);
constexpr syntax_option_type operator|(syntax_option_type lhs, syntax_option_type rhs);

enum match_flag_type
{
    match_default     = 0,
    match_not_bol     = unspecified,
    match_not_eol     = unspecified,
    match_not_bow     = unspecified,
    match_not_eow     = unspecified,
    match_any         = unspecified,
    match_not_null    = unspecified,
    match_continuous  = unspecified,
    match_prev_avail  = unspecified,
    format_default    = 0,
    format_sed        = unspecified,
    format_no_copy    = unspecified,
    format_first_only = unspecified
};

constexpr match_flag_type operator~(match_flag_type f);
constexpr match_flag_type operator&(match_flag_type lhs, match_flag_type rhs);
constexpr match_flag_type operator|(match_flag_type lhs, match_flag_type rhs);

enum error_type
{
    error_collate    = unspecified,
    error_ctype      = unspecified,
    error_escape     = unspecified,
    error_backref    = unspecified,
    error_brack      = unspecified,
    error_paren      = unspecified,
    error_brace      = unspecified,
    error_badbrace   = unspecified,
    error_range      = unspecified,
    error_space      = unspecified,
    error_badrepeat  = unspecified,
    error_complexity = unspecified,
    error_stack      = unspecified
};

}  // regex_constants

class regex_error
    : public runtime_error
{
public:
    explicit regex_error(regex_constants::error_type ecode);
    regex_constants::error_type code() const;
};

template <class charT>
struct regex_traits
{
public:
    typedef charT                   char_type;
    typedef basic_string<char_type> string_type;
    typedef locale                  locale_type;
    typedef /bitmask_type/          char_class_type;

    regex_traits();

    static size_t length(const char_type* p);
    charT translate(charT c) const;
    charT translate_nocase(charT c) const;
    template <class ForwardIterator>
        string_type
        transform(ForwardIterator first, ForwardIterator last) const;
    template <class ForwardIterator>
        string_type
        transform_primary( ForwardIterator first, ForwardIterator last) const;
    template <class ForwardIterator>
        string_type
        lookup_collatename(ForwardIterator first, ForwardIterator last) const;
    template <class ForwardIterator>
        char_class_type
        lookup_classname(ForwardIterator first, ForwardIterator last,
                         bool icase = false) const;
    bool isctype(charT c, char_class_type f) const;
    int value(charT ch, int radix) const;
    locale_type imbue(locale_type l);
    locale_type getloc()const;
};

template <class charT, class traits = regex_traits<charT>>
class basic_regex
{
public:
    // types:
    typedef charT                               value_type;
    typedef traits                              traits_type;
    typedef typename traits::string_type        string_type;
    typedef regex_constants::syntax_option_type flag_type;
    typedef typename traits::locale_type        locale_type;

    // constants:
    static constexpr regex_constants::syntax_option_type icase = regex_constants::icase;
    static constexpr regex_constants::syntax_option_type nosubs = regex_constants::nosubs;
    static constexpr regex_constants::syntax_option_type optimize = regex_constants::optimize;
    static constexpr regex_constants::syntax_option_type collate = regex_constants::collate;
    static constexpr regex_constants::syntax_option_type ECMAScript = regex_constants::ECMAScript;
    static constexpr regex_constants::syntax_option_type basic = regex_constants::basic;
    static constexpr regex_constants::syntax_option_type extended = regex_constants::extended;
    static constexpr regex_constants::syntax_option_type awk = regex_constants::awk;
    static constexpr regex_constants::syntax_option_type grep = regex_constants::grep;
    static constexpr regex_constants::syntax_option_type egrep = regex_constants::egrep;
    static constexpr regex_constants::syntax_option_type multiline = regex_constants::multiline;

    // construct/copy/destroy:
    basic_regex();
    explicit basic_regex(const charT* p, flag_type f = regex_constants::ECMAScript);
    basic_regex(const charT* p, size_t len, flag_type f = regex_constants::ECMAScript);
    basic_regex(const basic_regex&);
    basic_regex(basic_regex&&) noexcept;
    template <class ST, class SA>
        explicit basic_regex(const basic_string<charT, ST, SA>& p,
                             flag_type f = regex_constants::ECMAScript);
    template <class ForwardIterator>
        basic_regex(ForwardIterator first, ForwardIterator last,
                    flag_type f = regex_constants::ECMAScript);
    basic_regex(initializer_list<charT>, flag_type = regex_constants::ECMAScript);

    ~basic_regex();

    basic_regex& operator=(const basic_regex&);
    basic_regex& operator=(basic_regex&&) noexcept;
    basic_regex& operator=(const charT* ptr);
    basic_regex& operator=(initializer_list<charT> il);
    template <class ST, class SA>
        basic_regex& operator=(const basic_string<charT, ST, SA>& p);

    // assign:
    basic_regex& assign(const basic_regex& that);
    basic_regex& assign(basic_regex&& that) noexcept;
    basic_regex& assign(const charT* ptr,           flag_type f = regex_constants::ECMAScript);
    basic_regex& assign(const charT* p, size_t len, flag_type f = regex_constants::ECMAScript);
    template <class string_traits, class A>
        basic_regex& assign(const basic_string<charT, string_traits, A>& s,
                                                    flag_type f = regex_constants::ECMAScript);
    template <class InputIterator>
        basic_regex& assign(InputIterator first, InputIterator last,
                                                    flag_type f = regex_constants::ECMAScript);
    basic_regex& assign(initializer_list<charT>,    flag_type f = regex_constants::ECMAScript);

    // const operations:
    unsigned mark_count() const;
    flag_type flags() const;

    // locale:
    locale_type imbue(locale_type loc);
    locale_type getloc() const;

    // swap:
    void swap(basic_regex&);
};

template<class ForwardIterator>
basic_regex(ForwardIterator, ForwardIterator,
            regex_constants::syntax_option_type = regex_constants::ECMAScript)
    -> basic_regex<typename iterator_traits<ForwardIterator>::value_type>; // C++17

typedef basic_regex<char>    regex;
typedef basic_regex<wchar_t> wregex;

template <class charT, class traits>
    void swap(basic_regex<charT, traits>& e1, basic_regex<charT, traits>& e2);

template <class BidirectionalIterator>
class sub_match
    : public pair<BidirectionalIterator, BidirectionalIterator>
{
public:
    typedef typename iterator_traits<BidirectionalIterator>::value_type value_type;
    typedef typename iterator_traits<BidirectionalIterator>::difference_type difference_type;
    typedef BidirectionalIterator                                      iterator;
    typedef basic_string<value_type>                                string_type;

    bool matched;

    constexpr sub_match();

    difference_type length() const;
    operator string_type() const;
    string_type str() const;

    int compare(const sub_match& s) const;
    int compare(const string_type& s) const;
    int compare(const value_type* s) const;

    void swap(sub_match& s) noexcept(see below);
};

typedef sub_match<const char*>             csub_match;
typedef sub_match<const wchar_t*>          wcsub_match;
typedef sub_match<string::const_iterator>  ssub_match;
typedef sub_match<wstring::const_iterator> wssub_match;

template <class BiIter>
    bool
    operator==(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);

template <class BiIter>
    auto
    operator<=>(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs); // Since C++20

 template <class BiIter>                                                     // Removed in C++20
    bool
    operator!=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);

template <class BiIter>                                                      // Removed in C++20
    bool
    operator<(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);

template <class BiIter>                                                      // Removed in C++20
    bool
    operator<=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);

template <class BiIter>                                                      // Removed in C++20
    bool
    operator>=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);

template <class BiIter>                                                      // Removed in C++20
    bool
    operator>(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);

template <class BiIter, class ST, class SA>                                  // Removed in C++20
    bool
    operator==(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
               const sub_match<BiIter>& rhs);

template <class BiIter, class ST, class SA>                                  // Removed in C++20
    bool
    operator!=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
               const sub_match<BiIter>& rhs);

template <class BiIter, class ST, class SA>                                  // Removed in C++20
    bool
    operator<(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
              const sub_match<BiIter>& rhs);

template <class BiIter, class ST, class SA>                                  // Removed in C++20
    bool
    operator>(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
              const sub_match<BiIter>& rhs);

template <class BiIter, class ST, class SA>                                  // Removed in C++20
    bool operator>=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
                    const sub_match<BiIter>& rhs);

template <class BiIter, class ST, class SA>                                  // Removed in C++20
    bool
    operator<=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
               const sub_match<BiIter>& rhs);

template <class BiIter, class ST, class SA>
    bool
    operator==(const sub_match<BiIter>& lhs,
               const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);

template <class BiIter, class ST, class SA>                                  // Since C++20
    auto
    operator<=>(const sub_match<BiIter>& lhs,
                const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);

template <class BiIter, class ST, class SA>                                  // Removed in C++20
    bool
    operator!=(const sub_match<BiIter>& lhs,
               const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);

template <class BiIter, class ST, class SA>                                  // Removed in C++20
    bool
    operator<(const sub_match<BiIter>& lhs,
              const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);

template <class BiIter, class ST, class SA>                                  // Removed in C++20
    bool
    operator>(const sub_match<BiIter>& lhs,
                   const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);

template <class BiIter, class ST, class SA>                                  // Removed in C++20
    bool
    operator>=(const sub_match<BiIter>& lhs,
               const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);

template <class BiIter, class ST, class SA>                                  // Removed in C++20
    bool
    operator<=(const sub_match<BiIter>& lhs,
               const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);

template <class BiIter>                                                      // Removed in C++20
    bool
    operator==(typename iterator_traits<BiIter>::value_type const* lhs,
               const sub_match<BiIter>& rhs);

template <class BiIter>                                                      // Removed in C++20
    bool
    operator!=(typename iterator_traits<BiIter>::value_type const* lhs,
               const sub_match<BiIter>& rhs);

template <class BiIter>                                                      // Removed in C++20
    bool
    operator<(typename iterator_traits<BiIter>::value_type const* lhs,
              const sub_match<BiIter>& rhs);

template <class BiIter>                                                      // Removed in C++20
    bool
    operator>(typename iterator_traits<BiIter>::value_type const* lhs,
              const sub_match<BiIter>& rhs);

template <class BiIter>                                                      // Removed in C++20
    bool
    operator>=(typename iterator_traits<BiIter>::value_type const* lhs,
               const sub_match<BiIter>& rhs);

template <class BiIter>                                                      // Removed in C++20
    bool
    operator<=(typename iterator_traits<BiIter>::value_type const* lhs,
               const sub_match<BiIter>& rhs);

template <class BiIter>
    bool
    operator==(const sub_match<BiIter>& lhs,
               typename iterator_traits<BiIter>::value_type const* rhs);

template <class BiIter>                                                      // Since C++20
    auto
    operator<=>(const sub_match<BiIter>& lhs,
                typename iterator_traits<BiIter>::value_type const* rhs);

template <class BiIter, class ST, class SA>                                  // Removed in C++20
    bool
    operator!=(const sub_match<BiIter>& lhs,
               typename iterator_traits<BiIter>::value_type const* rhs);

template <class BiIter>                                                      // Removed in C++20
    bool
    operator<(const sub_match<BiIter>& lhs,
              typename iterator_traits<BiIter>::value_type const* rhs);

template <class BiIter>                                                      // Removed in C++20
    bool
    operator>(const sub_match<BiIter>& lhs,
              typename iterator_traits<BiIter>::value_type const* rhs);

template <class BiIter>                                                      // Removed in C++20
    bool
    operator>=(const sub_match<BiIter>& lhs,
               typename iterator_traits<BiIter>::value_type const* rhs);

template <class BiIter>                                                      // Removed in C++20
    bool
    operator<=(const sub_match<BiIter>& lhs,
               typename iterator_traits<BiIter>::value_type const* rhs);

template <class BiIter>                                                      // Removed in C++20
    bool
    operator==(typename iterator_traits<BiIter>::value_type const& lhs,
               const sub_match<BiIter>& rhs);

template <class BiIter>                                                      // Removed in C++20
    bool
    operator!=(typename iterator_traits<BiIter>::value_type const& lhs,
               const sub_match<BiIter>& rhs);

template <class BiIter>                                                      // Removed in C++20
    bool
    operator<(typename iterator_traits<BiIter>::value_type const& lhs,
              const sub_match<BiIter>& rhs);

template <class BiIter>                                                      // Removed in C++20
    bool
    operator>(typename iterator_traits<BiIter>::value_type const& lhs,
              const sub_match<BiIter>& rhs);

template <class BiIter>                                                      // Removed in C++20
    bool
    operator>=(typename iterator_traits<BiIter>::value_type const& lhs,
               const sub_match<BiIter>& rhs);

template <class BiIter>                                                      // Removed in C++20
    bool
    operator<=(typename iterator_traits<BiIter>::value_type const& lhs,
               const sub_match<BiIter>& rhs);

template <class BiIter>
    bool
    operator==(const sub_match<BiIter>& lhs,
               typename iterator_traits<BiIter>::value_type const& rhs);

template <class BiIter>                                                      // Since C++20
    auto
    operator<=>(const sub_match<BiIter>& lhs,
                typename iterator_traits<BiIter>::value_type const& rhs);

template <class BiIter>                                                      // Removed in C++20
    bool
    operator!=(const sub_match<BiIter>& lhs,
               typename iterator_traits<BiIter>::value_type const& rhs);

template <class BiIter>                                                      // Removed in C++20
    bool
    operator<(const sub_match<BiIter>& lhs,
              typename iterator_traits<BiIter>::value_type const& rhs);

template <class BiIter>                                                      // Removed in C++20
    bool
    operator>(const sub_match<BiIter>& lhs,
              typename iterator_traits<BiIter>::value_type const& rhs);

template <class BiIter>                                                      // Removed in C++20
    bool
    operator>=(const sub_match<BiIter>& lhs,
               typename iterator_traits<BiIter>::value_type const& rhs);

template <class BiIter>                                                      // Removed in C++20
    bool
    operator<=(const sub_match<BiIter>& lhs,
               typename iterator_traits<BiIter>::value_type const& rhs);

template <class charT, class ST, class BiIter>
    basic_ostream<charT, ST>&
    operator<<(basic_ostream<charT, ST>& os, const sub_match<BiIter>& m);

template <class BidirectionalIterator,
          class Allocator = allocator<sub_match<BidirectionalIterator>>>
class match_results
{
public:
    typedef sub_match<BidirectionalIterator>                  value_type;
    typedef const value_type&                                 const_reference;
    typedef value_type&                                       reference;
    typedef /implementation-defined/                          const_iterator;
    typedef const_iterator                                    iterator;
    typedef typename iterator_traits<BidirectionalIterator>::difference_type difference_type;
    typedef typename allocator_traits<Allocator>::size_type   size_type;
    typedef Allocator                                         allocator_type;
    typedef typename iterator_traits<BidirectionalIterator>::value_type char_type;
    typedef basic_string<char_type>                           string_type;

    // construct/copy/destroy:
    explicit match_results(const Allocator& a = Allocator()); // before C++20
    match_results() : match_results(Allocator()) {}           // C++20
    explicit match_results(const Allocator& a);               // C++20
    match_results(const match_results& m);
    match_results(match_results&& m) noexcept;
    match_results& operator=(const match_results& m);
    match_results& operator=(match_results&& m);
    ~match_results();

    bool ready() const;

    // size:
    size_type size() const;
    size_type max_size() const;
    bool empty() const;

    // element access:
    difference_type length(size_type sub = 0) const;
    difference_type position(size_type sub = 0) const;
    string_type str(size_type sub = 0) const;
    const_reference operator[](size_type n) const;

    const_reference prefix() const;
    const_reference suffix() const;

    const_iterator begin() const;
    const_iterator end() const;
    const_iterator cbegin() const;
    const_iterator cend() const;

    // format:
    template <class OutputIter>
        OutputIter
        format(OutputIter out, const char_type* fmt_first,
               const char_type* fmt_last,
               regex_constants::match_flag_type flags = regex_constants::format_default) const;
    template <class OutputIter, class ST, class SA>
        OutputIter
        format(OutputIter out, const basic_string<char_type, ST, SA>& fmt,
               regex_constants::match_flag_type flags = regex_constants::format_default) const;
    template <class ST, class SA>
        basic_string<char_type, ST, SA>
        format(const basic_string<char_type, ST, SA>& fmt,
               regex_constants::match_flag_type flags = regex_constants::format_default) const;
    string_type
        format(const char_type* fmt,
               regex_constants::match_flag_type flags = regex_constants::format_default) const;

    // allocator:
    allocator_type get_allocator() const;

    // swap:
    void swap(match_results& that);
};

typedef match_results<const char*>             cmatch;
typedef match_results<const wchar_t*>          wcmatch;
typedef match_results<string::const_iterator>  smatch;
typedef match_results<wstring::const_iterator> wsmatch;

template <class BidirectionalIterator, class Allocator>
    bool
    operator==(const match_results<BidirectionalIterator, Allocator>& m1,
               const match_results<BidirectionalIterator, Allocator>& m2);

template <class BidirectionalIterator, class Allocator>                    // Removed in C++20
    bool
    operator!=(const match_results<BidirectionalIterator, Allocator>& m1,
               const match_results<BidirectionalIterator, Allocator>& m2);

template <class BidirectionalIterator, class Allocator>
    void
    swap(match_results<BidirectionalIterator, Allocator>& m1,
         match_results<BidirectionalIterator, Allocator>& m2);

template <class BidirectionalIterator, class Allocator, class charT, class traits>
    bool
    regex_match(BidirectionalIterator first, BidirectionalIterator last,
                match_results<BidirectionalIterator, Allocator>& m,
                const basic_regex<charT, traits>& e,
                regex_constants::match_flag_type flags = regex_constants::match_default);

template <class BidirectionalIterator, class charT, class traits>
    bool
    regex_match(BidirectionalIterator first, BidirectionalIterator last,
                const basic_regex<charT, traits>& e,
                regex_constants::match_flag_type flags = regex_constants::match_default);

template <class charT, class Allocator, class traits>
    bool
    regex_match(const charT* str, match_results<const charT*, Allocator>& m,
                const basic_regex<charT, traits>& e,
                regex_constants::match_flag_type flags = regex_constants::match_default);

template <class ST, class SA, class Allocator, class charT, class traits>
    bool
    regex_match(const basic_string<charT, ST, SA>& s,
                match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
                const basic_regex<charT, traits>& e,
                regex_constants::match_flag_type flags = regex_constants::match_default);

template <class ST, class SA, class Allocator, class charT, class traits>
    bool
    regex_match(const basic_string<charT, ST, SA>&& s,
                match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
                const basic_regex<charT, traits>& e,
                regex_constants::match_flag_type flags = regex_constants::match_default) = delete; // C++14

template <class charT, class traits>
    bool
    regex_match(const charT* str, const basic_regex<charT, traits>& e,
                regex_constants::match_flag_type flags = regex_constants::match_default);

template <class ST, class SA, class charT, class traits>
    bool
    regex_match(const basic_string<charT, ST, SA>& s,
                const basic_regex<charT, traits>& e,
                regex_constants::match_flag_type flags = regex_constants::match_default);

template <class BidirectionalIterator, class Allocator, class charT, class traits>
    bool
    regex_search(BidirectionalIterator first, BidirectionalIterator last,
                 match_results<BidirectionalIterator, Allocator>& m,
                 const basic_regex<charT, traits>& e,
                 regex_constants::match_flag_type flags = regex_constants::match_default);

template <class BidirectionalIterator, class charT, class traits>
    bool
    regex_search(BidirectionalIterator first, BidirectionalIterator last,
                 const basic_regex<charT, traits>& e,
                 regex_constants::match_flag_type flags = regex_constants::match_default);

template <class charT, class Allocator, class traits>
    bool
    regex_search(const charT* str, match_results<const charT*, Allocator>& m,
                 const basic_regex<charT, traits>& e,
                 regex_constants::match_flag_type flags = regex_constants::match_default);

template <class charT, class traits>
    bool
    regex_search(const charT* str, const basic_regex<charT, traits>& e,
                 regex_constants::match_flag_type flags = regex_constants::match_default);

template <class ST, class SA, class charT, class traits>
    bool
    regex_search(const basic_string<charT, ST, SA>& s,
                 const basic_regex<charT, traits>& e,
                 regex_constants::match_flag_type flags = regex_constants::match_default);

template <class ST, class SA, class Allocator, class charT, class traits>
    bool
    regex_search(const basic_string<charT, ST, SA>& s,
                 match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
                 const basic_regex<charT, traits>& e,
                 regex_constants::match_flag_type flags = regex_constants::match_default);

template <class ST, class SA, class Allocator, class charT, class traits>
    bool
    regex_search(const basic_string<charT, ST, SA>&& s,
                 match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
                 const basic_regex<charT, traits>& e,
                 regex_constants::match_flag_type flags = regex_constants::match_default) = delete; // C++14

template <class OutputIterator, class BidirectionalIterator,
          class traits, class charT, class ST, class SA>
    OutputIterator
    regex_replace(OutputIterator out,
                  BidirectionalIterator first, BidirectionalIterator last,
                  const basic_regex<charT, traits>& e,
                  const basic_string<charT, ST, SA>& fmt,
                  regex_constants::match_flag_type flags = regex_constants::match_default);

template <class OutputIterator, class BidirectionalIterator,
          class traits, class charT>
    OutputIterator
    regex_replace(OutputIterator out,
                  BidirectionalIterator first, BidirectionalIterator last,
                  const basic_regex<charT, traits>& e, const charT* fmt,
                  regex_constants::match_flag_type flags = regex_constants::match_default);

template <class traits, class charT, class ST, class SA, class FST, class FSA>
    basic_string<charT, ST, SA>
    regex_replace(const basic_string<charT, ST, SA>& s,
                  const basic_regex<charT, traits>& e,
                  const basic_string<charT, FST, FSA>& fmt,
                  regex_constants::match_flag_type flags = regex_constants::match_default);

template <class traits, class charT, class ST, class SA>
    basic_string<charT, ST, SA>
    regex_replace(const basic_string<charT, ST, SA>& s,
                  const basic_regex<charT, traits>& e, const charT* fmt,
                  regex_constants::match_flag_type flags = regex_constants::match_default);

template <class traits, class charT, class ST, class SA>
    basic_string<charT>
    regex_replace(const charT* s,
                  const basic_regex<charT, traits>& e,
                  const basic_string<charT, ST, SA>& fmt,
                  regex_constants::match_flag_type flags = regex_constants::match_default);

template <class traits, class charT>
    basic_string<charT>
    regex_replace(const charT* s,
                  const basic_regex<charT, traits>& e,
                  const charT* fmt,
                  regex_constants::match_flag_type flags = regex_constants::match_default);

template <class BidirectionalIterator,
          class charT = typename iterator_traits< BidirectionalIterator>::value_type,
          class traits = regex_traits<charT>>
class regex_iterator
{
public:
    typedef basic_regex<charT, traits>           regex_type;
    typedef match_results<BidirectionalIterator> value_type;
    typedef ptrdiff_t                            difference_type;
    typedef const value_type*                    pointer;
    typedef const value_type&                    reference;
    typedef forward_iterator_tag                 iterator_category;
    typedef input_iterator_tag                   iterator_concept; // since C++20

    regex_iterator();
    regex_iterator(BidirectionalIterator a, BidirectionalIterator b,
                   const regex_type& re,
                   regex_constants::match_flag_type m = regex_constants::match_default);
    regex_iterator(BidirectionalIterator a, BidirectionalIterator b,
                   const regex_type&& re,
                   regex_constants::match_flag_type m
                                     = regex_constants::match_default) = delete; // C++14
    regex_iterator(const regex_iterator&);
    regex_iterator& operator=(const regex_iterator&);

    bool operator==(const regex_iterator&) const;
    bool operator==(default_sentinel_t) const { return *this == regex_iterator(); } // since C++20
    bool operator!=(const regex_iterator&) const;                                   // Removed in C++20

    const value_type& operator*() const;
    const value_type* operator->() const;

    regex_iterator& operator++();
    regex_iterator operator++(int);
};

typedef regex_iterator<const char*>             cregex_iterator;
typedef regex_iterator<const wchar_t*>          wcregex_iterator;
typedef regex_iterator<string::const_iterator>  sregex_iterator;
typedef regex_iterator<wstring::const_iterator> wsregex_iterator;

template <class BidirectionalIterator,
          class charT = typename iterator_traits<BidirectionalIterator>::value_type,
          class traits = regex_traits<charT>>
class regex_token_iterator
{
public:
    typedef basic_regex<charT, traits>       regex_type;
    typedef sub_match<BidirectionalIterator> value_type;
    typedef ptrdiff_t                        difference_type;
    typedef const value_type*                pointer;
    typedef const value_type&                reference;
    typedef forward_iterator_tag             iterator_category;
    typedef input_iterator_tag               iterator_concept; // since C++20

    regex_token_iterator();
    regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
                         const regex_type& re, int submatch = 0,
                         regex_constants::match_flag_type m = regex_constants::match_default);
    regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
                         const regex_type&& re, int submatch = 0,
                         regex_constants::match_flag_type m = regex_constants::match_default) = delete; // C++14
    regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
                         const regex_type& re, const vector<int>& submatches,
                         regex_constants::match_flag_type m = regex_constants::match_default);
    regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
                         const regex_type&& re, const vector<int>& submatches,
                         regex_constants::match_flag_type m = regex_constants::match_default) = delete; // C++14
    regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
                         const regex_type& re, initializer_list<int> submatches,
                         regex_constants::match_flag_type m = regex_constants::match_default);
    regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
                         const regex_type&& re, initializer_list<int> submatches,
                         regex_constants::match_flag_type m = regex_constants::match_default) = delete; // C++14
    template <size_t N>
        regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
                             const regex_type& re, const int (&submatches)[N],
                             regex_constants::match_flag_type m = regex_constants::match_default);
    template <size_t N>
        regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
                             const regex_type&& re, const int (&submatches)[N],
                             regex_constants::match_flag_type m = regex_constants::match_default) = delete; // C++14
    regex_token_iterator(const regex_token_iterator&);
    regex_token_iterator& operator=(const regex_token_iterator&);

    bool operator==(const regex_token_iterator&) const;
    bool operator==(default_sentinel_t) const { return *this == regex_token_iterator(); } // since C++20
    bool operator!=(const regex_token_iterator&) const;                                   // Removed in C++20

    const value_type& operator*() const;
    const value_type* operator->() const;

    regex_token_iterator& operator++();
    regex_token_iterator operator++(int);
};

typedef regex_token_iterator<const char*>             cregex_token_iterator;
typedef regex_token_iterator<const wchar_t*>          wcregex_token_iterator;
typedef regex_token_iterator<string::const_iterator>  sregex_token_iterator;
typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator;

} // std
*/

#include <__algorithm/find.h>
#include <__algorithm/search.h>
#include <__assert>
#include <__config>
#include <__iterator/back_insert_iterator.h>
#include <__iterator/default_sentinel.h>
#include <__iterator/wrap_iter.h>
#include <__locale>
#include <__memory/shared_ptr.h>
#include <__memory_resource/polymorphic_allocator.h>
#include <__type_traits/is_swappable.h>
#include <__utility/move.h>
#include <__utility/pair.h>
#include <__utility/swap.h>
#include <__verbose_abort>
#include <deque>
#include <stdexcept>
#include <string>
#include <vector>
#include <version>

// standard-mandated includes

// [iterator.range]
#include <__iterator/access.h>
#include <__iterator/data.h>
#include <__iterator/empty.h>
#include <__iterator/reverse_access.h>
#include <__iterator/size.h>

// [re.syn]
#include <compare>
#include <initializer_list>

#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
#  pragma GCC system_header
#endif

_LIBCPP_PUSH_MACROS
#include <__undef_macros>

#define _LIBCPP_REGEX_COMPLEXITY_FACTOR 4096

_LIBCPP_BEGIN_NAMESPACE_STD

namespace regex_constants {

// syntax_option_type

enum syntax_option_type {
  icase    = 1 << 0,
  nosubs   = 1 << 1,
  optimize = 1 << 2,
  collate  = 1 << 3,
#ifdef _LIBCPP_ABI_REGEX_CONSTANTS_NONZERO
  ECMAScript = 1 << 9,
#else
  ECMAScript = 0,
#endif
  basic    = 1 << 4,
  extended = 1 << 5,
  awk      = 1 << 6,
  grep     = 1 << 7,
  egrep    = 1 << 8,
  // 1 << 9 may be used by ECMAScript
  multiline = 1 << 10
};

_LIBCPP_HIDE_FROM_ABI inline _LIBCPP_CONSTEXPR syntax_option_type __get_grammar(syntax_option_type __g) {
#ifdef _LIBCPP_ABI_REGEX_CONSTANTS_NONZERO
  return static_cast<syntax_option_type>(__g & 0x3F0);
#else
  return static_cast<syntax_option_type>(__g & 0x1F0);
#endif
}

inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR syntax_option_type operator~(syntax_option_type __x) {
  return syntax_option_type(~int(__x) & 0x1FF);
}

inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR syntax_option_type
operator&(syntax_option_type __x, syntax_option_type __y) {
  return syntax_option_type(int(__x) & int(__y));
}

inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR syntax_option_type
operator|(syntax_option_type __x, syntax_option_type __y) {
  return syntax_option_type(int(__x) | int(__y));
}

inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR syntax_option_type
operator^(syntax_option_type __x, syntax_option_type __y) {
  return syntax_option_type(int(__x) ^ int(__y));
}

inline _LIBCPP_HIDE_FROM_ABI syntax_option_type& operator&=(syntax_option_type& __x, syntax_option_type __y) {
  __x = __x & __y;
  return __x;
}

inline _LIBCPP_HIDE_FROM_ABI syntax_option_type& operator|=(syntax_option_type& __x, syntax_option_type __y) {
  __x = __x | __y;
  return __x;
}

inline _LIBCPP_HIDE_FROM_ABI syntax_option_type& operator^=(syntax_option_type& __x, syntax_option_type __y) {
  __x = __x ^ __y;
  return __x;
}

// match_flag_type

enum match_flag_type {
  match_default     = 0,
  match_not_bol     = 1 << 0,
  match_not_eol     = 1 << 1,
  match_not_bow     = 1 << 2,
  match_not_eow     = 1 << 3,
  match_any         = 1 << 4,
  match_not_null    = 1 << 5,
  match_continuous  = 1 << 6,
  match_prev_avail  = 1 << 7,
  format_default    = 0,
  format_sed        = 1 << 8,
  format_no_copy    = 1 << 9,
  format_first_only = 1 << 10,
  __no_update_pos   = 1 << 11,
  __full_match      = 1 << 12
};

inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR match_flag_type operator~(match_flag_type __x) {
  return match_flag_type(~int(__x) & 0x0FFF);
}

inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR match_flag_type operator&(match_flag_type __x, match_flag_type __y) {
  return match_flag_type(int(__x) & int(__y));
}

inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR match_flag_type operator|(match_flag_type __x, match_flag_type __y) {
  return match_flag_type(int(__x) | int(__y));
}

inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR match_flag_type operator^(match_flag_type __x, match_flag_type __y) {
  return match_flag_type(int(__x) ^ int(__y));
}

inline _LIBCPP_HIDE_FROM_ABI match_flag_type& operator&=(match_flag_type& __x, match_flag_type __y) {
  __x = __x & __y;
  return __x;
}

inline _LIBCPP_HIDE_FROM_ABI match_flag_type& operator|=(match_flag_type& __x, match_flag_type __y) {
  __x = __x | __y;
  return __x;
}

inline _LIBCPP_HIDE_FROM_ABI match_flag_type& operator^=(match_flag_type& __x, match_flag_type __y) {
  __x = __x ^ __y;
  return __x;
}

enum error_type {
  error_collate = 1,
  error_ctype,
  error_escape,
  error_backref,
  error_brack,
  error_paren,
  error_brace,
  error_badbrace,
  error_range,
  error_space,
  error_badrepeat,
  error_complexity,
  error_stack,
  __re_err_grammar,
  __re_err_empty,
  __re_err_unknown,
  __re_err_parse
};

} // namespace regex_constants

class _LIBCPP_EXPORTED_FROM_ABI regex_error : public runtime_error {
  regex_constants::error_type __code_;

public:
  explicit regex_error(regex_constants::error_type __ecode);
  _LIBCPP_HIDE_FROM_ABI regex_error(const regex_error&) _NOEXCEPT = default;
  ~regex_error() _NOEXCEPT override;
  _LIBCPP_HIDE_FROM_ABI regex_constants::error_type code() const { return __code_; }
};

template <regex_constants::error_type _Ev>
[[__noreturn__]] inline _LIBCPP_HIDE_FROM_ABI void __throw_regex_error() {
#if _LIBCPP_HAS_EXCEPTIONS
  throw regex_error(_Ev);
#else
  _LIBCPP_VERBOSE_ABORT("regex_error was thrown in -fno-exceptions mode");
#endif
}

template <class _CharT>
struct _LIBCPP_TEMPLATE_VIS regex_traits {
public:
  typedef _CharT char_type;
  typedef basic_string<char_type> string_type;
  typedef locale locale_type;
#if defined(__BIONIC__) || defined(_NEWLIB_VERSION)
  // Originally bionic's ctype_base used its own ctype masks because the
  // builtin ctype implementation wasn't in libc++ yet. Bionic's ctype mask
  // was only 8 bits wide and already saturated, so it used a wider type here
  // to make room for __regex_word (then a part of this class rather than
  // ctype_base). Bionic has since moved to the builtin ctype_base
  // implementation, but this was not updated to match. Since then Android has
  // needed to maintain a stable libc++ ABI, and this can't be changed without
  // an ABI break.
  // We also need this workaround for newlib since _NEWLIB_VERSION is not
  // defined yet inside __config, so we can't set the
  // _LIBCPP_PROVIDES_DEFAULT_RUNE_TABLE macro. Additionally, newlib is
  // often used for space constrained environments, so it makes sense not to
  // duplicate the ctype table.
  typedef uint16_t char_class_type;
#else
  typedef ctype_base::mask char_class_type;
#endif

  static const char_class_type __regex_word = ctype_base::__regex_word;

private:
  locale __loc_;
  const ctype<char_type>* __ct_;
  const collate<char_type>* __col_;

public:
  regex_traits();

  _LIBCPP_HIDE_FROM_ABI static size_t length(const char_type* __p) { return char_traits<char_type>::length(__p); }
  _LIBCPP_HIDE_FROM_ABI char_type translate(char_type __c) const { return __c; }
  char_type translate_nocase(char_type __c) const;
  template <class _ForwardIterator>
  string_type transform(_ForwardIterator __f, _ForwardIterator __l) const;
  template <class _ForwardIterator>
  _LIBCPP_HIDE_FROM_ABI string_type transform_primary(_ForwardIterator __f, _ForwardIterator __l) const {
    return __transform_primary(__f, __l, char_type());
  }
  template <class _ForwardIterator>
  _LIBCPP_HIDE_FROM_ABI string_type lookup_collatename(_ForwardIterator __f, _ForwardIterator __l) const {
    return __lookup_collatename(__f, __l, char_type());
  }
  template <class _ForwardIterator>
  _LIBCPP_HIDE_FROM_ABI char_class_type
  lookup_classname(_ForwardIterator __f, _ForwardIterator __l, bool __icase = false) const {
    return __lookup_classname(__f, __l, __icase, char_type());
  }
  bool isctype(char_type __c, char_class_type __m) const;
  _LIBCPP_HIDE_FROM_ABI int value(char_type __ch, int __radix) const { return __regex_traits_value(__ch, __radix); }
  locale_type imbue(locale_type __l);
  _LIBCPP_HIDE_FROM_ABI locale_type getloc() const { return __loc_; }

private:
  void __init();

  template <class _ForwardIterator>
  string_type __transform_primary(_ForwardIterator __f, _ForwardIterator __l, char) const;
#if _LIBCPP_HAS_WIDE_CHARACTERS
  template <class _ForwardIterator>
  string_type __transform_primary(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const;
#endif
  template <class _ForwardIterator>
  string_type __lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, char) const;
#if _LIBCPP_HAS_WIDE_CHARACTERS
  template <class _ForwardIterator>
  string_type __lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const;
#endif
  template <class _ForwardIterator>
  char_class_type __lookup_classname(_ForwardIterator __f, _ForwardIterator __l, bool __icase, char) const;
#if _LIBCPP_HAS_WIDE_CHARACTERS
  template <class _ForwardIterator>
  char_class_type __lookup_classname(_ForwardIterator __f, _ForwardIterator __l, bool __icase, wchar_t) const;
#endif

  static int __regex_traits_value(unsigned char __ch, int __radix);
  _LIBCPP_HIDE_FROM_ABI int __regex_traits_value(char __ch, int __radix) const {
    return __regex_traits_value(static_cast<unsigned char>(__ch), __radix);
  }
#if _LIBCPP_HAS_WIDE_CHARACTERS
  _LIBCPP_HIDE_FROM_ABI int __regex_traits_value(wchar_t __ch, int __radix) const;
#endif
};

template <class _CharT>
const typename regex_traits<_CharT>::char_class_type regex_traits<_CharT>::__regex_word;

template <class _CharT>
regex_traits<_CharT>::regex_traits() {
  __init();
}

template <class _CharT>
typename regex_traits<_CharT>::char_type regex_traits<_CharT>::translate_nocase(char_type __c) const {
  return __ct_->tolower(__c);
}

template <class _CharT>
template <class _ForwardIterator>
typename regex_traits<_CharT>::string_type
regex_traits<_CharT>::transform(_ForwardIterator __f, _ForwardIterator __l) const {
  string_type __s(__f, __l);
  return __col_->transform(__s.data(), __s.data() + __s.size());
}

template <class _CharT>
void regex_traits<_CharT>::__init() {
  __ct_  = &std::use_facet<ctype<char_type> >(__loc_);
  __col_ = &std::use_facet<collate<char_type> >(__loc_);
}

template <class _CharT>
typename regex_traits<_CharT>::locale_type regex_traits<_CharT>::imbue(locale_type __l) {
  locale __r = __loc_;
  __loc_     = __l;
  __init();
  return __r;
}

// transform_primary is very FreeBSD-specific

template <class _CharT>
template <class _ForwardIterator>
typename regex_traits<_CharT>::string_type
regex_traits<_CharT>::__transform_primary(_ForwardIterator __f, _ForwardIterator __l, char) const {
  const string_type __s(__f, __l);
  string_type __d = __col_->transform(__s.data(), __s.data() + __s.size());
  switch (__d.size()) {
  case 1:
    break;
  case 12:
    __d[11] = __d[3];
    break;
  default:
    __d.clear();
    break;
  }
  return __d;
}

#if _LIBCPP_HAS_WIDE_CHARACTERS
template <class _CharT>
template <class _ForwardIterator>
typename regex_traits<_CharT>::string_type
regex_traits<_CharT>::__transform_primary(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const {
  const string_type __s(__f, __l);
  string_type __d = __col_->transform(__s.data(), __s.data() + __s.size());
  switch (__d.size()) {
  case 1:
    break;
  case 3:
    __d[2] = __d[0];
    break;
  default:
    __d.clear();
    break;
  }
  return __d;
}
#endif

// lookup_collatename is very FreeBSD-specific

_LIBCPP_EXPORTED_FROM_ABI string __get_collation_name(const char* __s);

template <class _CharT>
template <class _ForwardIterator>
typename regex_traits<_CharT>::string_type
regex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, char) const {
  string_type __s(__f, __l);
  string_type __r;
  if (!__s.empty()) {
    __r = std::__get_collation_name(__s.c_str());
    if (__r.empty() && __s.size() <= 2) {
      __r = __col_->transform(__s.data(), __s.data() + __s.size());
      if (__r.size() == 1 || __r.size() == 12)
        __r = __s;
      else
        __r.clear();
    }
  }
  return __r;
}

#if _LIBCPP_HAS_WIDE_CHARACTERS
template <class _CharT>
template <class _ForwardIterator>
typename regex_traits<_CharT>::string_type
regex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const {
  string_type __s(__f, __l);
  string __n;
  __n.reserve(__s.size());
  for (typename string_type::const_iterator __i = __s.begin(), __e = __s.end(); __i != __e; ++__i) {
    if (static_cast<unsigned>(*__i) >= 127)
      return string_type();
    __n.push_back(char(*__i));
  }
  string_type __r;
  if (!__s.empty()) {
    __n = __get_collation_name(__n.c_str());
    if (!__n.empty())
      __r.assign(__n.begin(), __n.end());
    else if (__s.size() <= 2) {
      __r = __col_->transform(__s.data(), __s.data() + __s.size());
      if (__r.size() == 1 || __r.size() == 3)
        __r = __s;
      else
        __r.clear();
    }
  }
  return __r;
}
#endif // _LIBCPP_HAS_WIDE_CHARACTERS

// lookup_classname

regex_traits<char>::char_class_type _LIBCPP_EXPORTED_FROM_ABI __get_classname(const char* __s, bool __icase);

template <class _CharT>
template <class _ForwardIterator>
typename regex_traits<_CharT>::char_class_type
regex_traits<_CharT>::__lookup_classname(_ForwardIterator __f, _ForwardIterator __l, bool __icase, char) const {
  string_type __s(__f, __l);
  __ct_->tolower(&__s[0], &__s[0] + __s.size());
  return std::__get_classname(__s.c_str(), __icase);
}

#if _LIBCPP_HAS_WIDE_CHARACTERS
template <class _CharT>
template <class _ForwardIterator>
typename regex_traits<_CharT>::char_class_type
regex_traits<_CharT>::__lookup_classname(_ForwardIterator __f, _ForwardIterator __l, bool __icase, wchar_t) const {
  string_type __s(__f, __l);
  __ct_->tolower(&__s[0], &__s[0] + __s.size());
  string __n;
  __n.reserve(__s.size());
  for (typename string_type::const_iterator __i = __s.begin(), __e = __s.end(); __i != __e; ++__i) {
    if (static_cast<unsigned>(*__i) >= 127)
      return char_class_type();
    __n.push_back(char(*__i));
  }
  return __get_classname(__n.c_str(), __icase);
}
#endif // _LIBCPP_HAS_WIDE_CHARACTERS

template <class _CharT>
bool regex_traits<_CharT>::isctype(char_type __c, char_class_type __m) const {
  if (__ct_->is(__m, __c))
    return true;
  return (__c == '_' && (__m & __regex_word));
}

inline _LIBCPP_HIDE_FROM_ABI bool __is_07(unsigned char __c) {
  return (__c & 0xF8u) ==
#if defined(__MVS__) && !defined(__NATIVE_ASCII_F)
         0xF0;
#else
         0x30;
#endif
}

inline _LIBCPP_HIDE_FROM_ABI bool __is_89(unsigned char __c) {
  return (__c & 0xFEu) ==
#if defined(__MVS__) && !defined(__NATIVE_ASCII_F)
         0xF8;
#else
         0x38;
#endif
}

inline _LIBCPP_HIDE_FROM_ABI unsigned char __to_lower(unsigned char __c) {
#if defined(__MVS__) && !defined(__NATIVE_ASCII_F)
  return __c & 0xBF;
#else
  return __c | 0x20;
#endif
}

template <class _CharT>
int regex_traits<_CharT>::__regex_traits_value(unsigned char __ch, int __radix) {
  if (__is_07(__ch)) // '0' <= __ch && __ch <= '7'
    return __ch - '0';
  if (__radix != 8) {
    if (__is_89(__ch)) // '8' <= __ch && __ch <= '9'
      return __ch - '0';
    if (__radix == 16) {
      __ch = __to_lower(__ch); // tolower
      if ('a' <= __ch && __ch <= 'f')
        return __ch - ('a' - 10);
    }
  }
  return -1;
}

#if _LIBCPP_HAS_WIDE_CHARACTERS
template <class _CharT>
inline int regex_traits<_CharT>::__regex_traits_value(wchar_t __ch, int __radix) const {
  return __regex_traits_value(static_cast<unsigned char>(__ct_->narrow(__ch, char_type())), __radix);
}
#endif

template <class _CharT>
class __node;

template <class _BidirectionalIterator>
class _LIBCPP_TEMPLATE_VIS sub_match;

template <class _BidirectionalIterator, class _Allocator = allocator<sub_match<_BidirectionalIterator> > >
class _LIBCPP_TEMPLATE_VIS match_results;

template <class _CharT>
struct __state {
  enum {
    __end_state = -1000,
    __consume_input,          // -999
    __begin_marked_expr,      // -998
    __end_marked_expr,        // -997
    __pop_state,              // -996
    __accept_and_consume,     // -995
    __accept_but_not_consume, // -994
    __reject,                 // -993
    __split,
    __repeat
  };

  int __do_;
  const _CharT* __first_;
  const _CharT* __current_;
  const _CharT* __last_;
  vector<sub_match<const _CharT*> > __sub_matches_;
  vector<pair<size_t, const _CharT*> > __loop_data_;
  const __node<_CharT>* __node_;
  regex_constants::match_flag_type __flags_;
  bool __at_first_;

  _LIBCPP_HIDE_FROM_ABI __state()
      : __do_(0),
        __first_(nullptr),
        __current_(nullptr),
        __last_(nullptr),
        __node_(nullptr),
        __flags_(),
        __at_first_(false) {}
};

// __node

template <class _CharT>
class __node {
public:
  typedef std::__state<_CharT> __state;

  _LIBCPP_HIDE_FROM_ABI __node() {}
  __node(const __node&)            = delete;
  __node& operator=(const __node&) = delete;
  _LIBCPP_HIDE_FROM_ABI_VIRTUAL
  virtual ~__node() {}

  _LIBCPP_HIDE_FROM_ABI_VIRTUAL
  virtual void __exec(__state&) const {}
  _LIBCPP_HIDE_FROM_ABI_VIRTUAL
  virtual void __exec_split(bool, __state&) const {}
};

// __end_state

template <class _CharT>
class __end_state : public __node<_CharT> {
public:
  typedef std::__state<_CharT> __state;

  _LIBCPP_HIDE_FROM_ABI __end_state() {}

  _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const;
};

template <class _CharT>
void __end_state<_CharT>::__exec(__state& __s) const {
  __s.__do_ = __state::__end_state;
}

// __has_one_state

template <class _CharT>
class __has_one_state : public __node<_CharT> {
  __node<_CharT>* __first_;

public:
  _LIBCPP_HIDE_FROM_ABI explicit __has_one_state(__node<_CharT>* __s) : __first_(__s) {}

  _LIBCPP_HIDE_FROM_ABI __node<_CharT>* first() const { return __first_; }
  _LIBCPP_HIDE_FROM_ABI __node<_CharT>*& first() { return __first_; }
};

// __owns_one_state

template <class _CharT>
class __owns_one_state : public __has_one_state<_CharT> {
  typedef __has_one_state<_CharT> base;

public:
  _LIBCPP_HIDE_FROM_ABI explicit __owns_one_state(__node<_CharT>* __s) : base(__s) {}

  ~__owns_one_state() override;
};

template <class _CharT>
__owns_one_state<_CharT>::~__owns_one_state() {
  delete this->first();
}

// __empty_state

template <class _CharT>
class __empty_state : public __owns_one_state<_CharT> {
  typedef __owns_one_state<_CharT> base;

public:
  typedef std::__state<_CharT> __state;

  _LIBCPP_HIDE_FROM_ABI explicit __empty_state(__node<_CharT>* __s) : base(__s) {}

  _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const;
};

template <class _CharT>
void __empty_state<_CharT>::__exec(__state& __s) const {
  __s.__do_   = __state::__accept_but_not_consume;
  __s.__node_ = this->first();
}

// __empty_non_own_state

template <class _CharT>
class __empty_non_own_state : public __has_one_state<_CharT> {
  typedef __has_one_state<_CharT> base;

public:
  typedef std::__state<_CharT> __state;

  _LIBCPP_HIDE_FROM_ABI explicit __empty_non_own_state(__node<_CharT>* __s) : base(__s) {}

  _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const;
};

template <class _CharT>
void __empty_non_own_state<_CharT>::__exec(__state& __s) const {
  __s.__do_   = __state::__accept_but_not_consume;
  __s.__node_ = this->first();
}

// __repeat_one_loop

template <class _CharT>
class __repeat_one_loop : public __has_one_state<_CharT> {
  typedef __has_one_state<_CharT> base;

public:
  typedef std::__state<_CharT> __state;

  _LIBCPP_HIDE_FROM_ABI explicit __repeat_one_loop(__node<_CharT>* __s) : base(__s) {}

  _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const;
};

template <class _CharT>
void __repeat_one_loop<_CharT>::__exec(__state& __s) const {
  __s.__do_   = __state::__repeat;
  __s.__node_ = this->first();
}

// __owns_two_states

template <class _CharT>
class __owns_two_states : public __owns_one_state<_CharT> {
  typedef __owns_one_state<_CharT> base;

  base* __second_;

public:
  _LIBCPP_HIDE_FROM_ABI explicit __owns_two_states(__node<_CharT>* __s1, base* __s2) : base(__s1), __second_(__s2) {}

  _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual ~__owns_two_states();

  _LIBCPP_HIDE_FROM_ABI base* second() const { return __second_; }
  _LIBCPP_HIDE_FROM_ABI base*& second() { return __second_; }
};

template <class _CharT>
__owns_two_states<_CharT>::~__owns_two_states() {
  delete __second_;
}

// __loop

template <class _CharT>
class __loop : public __owns_two_states<_CharT> {
  typedef __owns_two_states<_CharT> base;

  size_t __min_;
  size_t __max_;
  unsigned __loop_id_;
  unsigned __mexp_begin_;
  unsigned __mexp_end_;
  bool __greedy_;

public:
  typedef std::__state<_CharT> __state;

  _LIBCPP_HIDE_FROM_ABI explicit __loop(
      unsigned __loop_id,
      __node<_CharT>* __s1,
      __owns_one_state<_CharT>* __s2,
      unsigned __mexp_begin,
      unsigned __mexp_end,
      bool __greedy = true,
      size_t __min  = 0,
      size_t __max  = numeric_limits<size_t>::max())
      : base(__s1, __s2),
        __min_(__min),
        __max_(__max),
        __loop_id_(__loop_id),
        __mexp_begin_(__mexp_begin),
        __mexp_end_(__mexp_end),
        __greedy_(__greedy) {}

  _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state& __s) const;
  _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec_split(bool __second, __state& __s) const;

private:
  _LIBCPP_HIDE_FROM_ABI void __init_repeat(__state& __s) const {
    __s.__loop_data_[__loop_id_].second = __s.__current_;
    for (size_t __i = __mexp_begin_ - 1; __i != __mexp_end_ - 1; ++__i) {
      __s.__sub_matches_[__i].first   = __s.__last_;
      __s.__sub_matches_[__i].second  = __s.__last_;
      __s.__sub_matches_[__i].matched = false;
    }
  }
};

template <class _CharT>
void __loop<_CharT>::__exec(__state& __s) const {
  if (__s.__do_ == __state::__repeat) {
    bool __do_repeat = ++__s.__loop_data_[__loop_id_].first < __max_;
    bool __do_alt    = __s.__loop_data_[__loop_id_].first >= __min_;
    if (__do_repeat && __do_alt && __s.__loop_data_[__loop_id_].second == __s.__current_)
      __do_repeat = false;
    if (__do_repeat && __do_alt)
      __s.__do_ = __state::__split;
    else if (__do_repeat) {
      __s.__do_   = __state::__accept_but_not_consume;
      __s.__node_ = this->first();
      __init_repeat(__s);
    } else {
      __s.__do_   = __state::__accept_but_not_consume;
      __s.__node_ = this->second();
    }
  } else {
    __s.__loop_data_[__loop_id_].first = 0;
    bool __do_repeat                   = 0 < __max_;
    bool __do_alt                      = 0 >= __min_;
    if (__do_repeat && __do_alt)
      __s.__do_ = __state::__split;
    else if (__do_repeat) {
      __s.__do_   = __state::__accept_but_not_consume;
      __s.__node_ = this->first();
      __init_repeat(__s);
    } else {
      __s.__do_   = __state::__accept_but_not_consume;
      __s.__node_ = this->second();
    }
  }
}

template <class _CharT>
void __loop<_CharT>::__exec_split(bool __second, __state& __s) const {
  __s.__do_ = __state::__accept_but_not_consume;
  if (__greedy_ != __second) {
    __s.__node_ = this->first();
    __init_repeat(__s);
  } else
    __s.__node_ = this->second();
}

// __alternate

template <class _CharT>
class __alternate : public __owns_two_states<_CharT> {
  typedef __owns_two_states<_CharT> base;

public:
  typedef std::__state<_CharT> __state;

  _LIBCPP_HIDE_FROM_ABI explicit __alternate(__owns_one_state<_CharT>* __s1, __owns_one_state<_CharT>* __s2)
      : base(__s1, __s2) {}

  _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state& __s) const;
  _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec_split(bool __second, __state& __s) const;
};

template <class _CharT>
void __alternate<_CharT>::__exec(__state& __s) const {
  __s.__do_ = __state::__split;
}

template <class _CharT>
void __alternate<_CharT>::__exec_split(bool __second, __state& __s) const {
  __s.__do_ = __state::__accept_but_not_consume;
  if (__second)
    __s.__node_ = this->second();
  else
    __s.__node_ = this->first();
}

// __begin_marked_subexpression

template <class _CharT>
class __begin_marked_subexpression : public __owns_one_state<_CharT> {
  typedef __owns_one_state<_CharT> base;

  unsigned __mexp_;

public:
  typedef std::__state<_CharT> __state;

  _LIBCPP_HIDE_FROM_ABI explicit __begin_marked_subexpression(unsigned __mexp, __node<_CharT>* __s)
      : base(__s), __mexp_(__mexp) {}

  _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const;
};

template <class _CharT>
void __begin_marked_subexpression<_CharT>::__exec(__state& __s) const {
  __s.__do_                             = __state::__accept_but_not_consume;
  __s.__sub_matches_[__mexp_ - 1].first = __s.__current_;
  __s.__node_                           = this->first();
}

// __end_marked_subexpression

template <class _CharT>
class __end_marked_subexpression : public __owns_one_state<_CharT> {
  typedef __owns_one_state<_CharT> base;

  unsigned __mexp_;

public:
  typedef std::__state<_CharT> __state;

  _LIBCPP_HIDE_FROM_ABI explicit __end_marked_subexpression(unsigned __mexp, __node<_CharT>* __s)
      : base(__s), __mexp_(__mexp) {}

  _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const;
};

template <class _CharT>
void __end_marked_subexpression<_CharT>::__exec(__state& __s) const {
  __s.__do_                               = __state::__accept_but_not_consume;
  __s.__sub_matches_[__mexp_ - 1].second  = __s.__current_;
  __s.__sub_matches_[__mexp_ - 1].matched = true;
  __s.__node_                             = this->first();
}

// __back_ref

template <class _CharT>
class __back_ref : public __owns_one_state<_CharT> {
  typedef __owns_one_state<_CharT> base;

  unsigned __mexp_;

public:
  typedef std::__state<_CharT> __state;

  _LIBCPP_HIDE_FROM_ABI explicit __back_ref(unsigned __mexp, __node<_CharT>* __s) : base(__s), __mexp_(__mexp) {}

  _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const;
};

template <class _CharT>
void __back_ref<_CharT>::__exec(__state& __s) const {
  if (__mexp_ > __s.__sub_matches_.size())
    __throw_regex_error<regex_constants::error_backref>();
  sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_ - 1];
  if (__sm.matched) {
    ptrdiff_t __len = __sm.second - __sm.first;
    if (__s.__last_ - __s.__current_ >= __len && std::equal(__sm.first, __sm.second, __s.__current_)) {
      __s.__do_ = __state::__accept_but_not_consume;
      __s.__current_ += __len;
      __s.__node_ = this->first();
    } else {
      __s.__do_   = __state::__reject;
      __s.__node_ = nullptr;
    }
  } else {
    __s.__do_   = __state::__reject;
    __s.__node_ = nullptr;
  }
}

// __back_ref_icase

template <class _CharT, class _Traits>
class __back_ref_icase : public __owns_one_state<_CharT> {
  typedef __owns_one_state<_CharT> base;

  _Traits __traits_;
  unsigned __mexp_;

public:
  typedef std::__state<_CharT> __state;

  _LIBCPP_HIDE_FROM_ABI explicit __back_ref_icase(const _Traits& __traits, unsigned __mexp, __node<_CharT>* __s)
      : base(__s), __traits_(__traits), __mexp_(__mexp) {}

  _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const;
};

template <class _CharT, class _Traits>
void __back_ref_icase<_CharT, _Traits>::__exec(__state& __s) const {
  sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_ - 1];
  if (__sm.matched) {
    ptrdiff_t __len = __sm.second - __sm.first;
    if (__s.__last_ - __s.__current_ >= __len) {
      for (ptrdiff_t __i = 0; __i < __len; ++__i) {
        if (__traits_.translate_nocase(__sm.first[__i]) != __traits_.translate_nocase(__s.__current_[__i]))
          goto __not_equal;
      }
      __s.__do_ = __state::__accept_but_not_consume;
      __s.__current_ += __len;
      __s.__node_ = this->first();
    } else {
      __s.__do_   = __state::__reject;
      __s.__node_ = nullptr;
    }
  } else {
  __not_equal:
    __s.__do_   = __state::__reject;
    __s.__node_ = nullptr;
  }
}

// __back_ref_collate

template <class _CharT, class _Traits>
class __back_ref_collate : public __owns_one_state<_CharT> {
  typedef __owns_one_state<_CharT> base;

  _Traits __traits_;
  unsigned __mexp_;

public:
  typedef std::__state<_CharT> __state;

  _LIBCPP_HIDE_FROM_ABI explicit __back_ref_collate(const _Traits& __traits, unsigned __mexp, __node<_CharT>* __s)
      : base(__s), __traits_(__traits), __mexp_(__mexp) {}

  _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const;
};

template <class _CharT, class _Traits>
void __back_ref_collate<_CharT, _Traits>::__exec(__state& __s) const {
  sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_ - 1];
  if (__sm.matched) {
    ptrdiff_t __len = __sm.second - __sm.first;
    if (__s.__last_ - __s.__current_ >= __len) {
      for (ptrdiff_t __i = 0; __i < __len; ++__i) {
        if (__traits_.translate(__sm.first[__i]) != __traits_.translate(__s.__current_[__i]))
          goto __not_equal;
      }
      __s.__do_ = __state::__accept_but_not_consume;
      __s.__current_ += __len;
      __s.__node_ = this->first();
    } else {
      __s.__do_   = __state::__reject;
      __s.__node_ = nullptr;
    }
  } else {
  __not_equal:
    __s.__do_   = __state::__reject;
    __s.__node_ = nullptr;
  }
}

// __word_boundary

template <class _CharT, class _Traits>
class __word_boundary : public __owns_one_state<_CharT> {
  typedef __owns_one_state<_CharT> base;

  _Traits __traits_;
  bool __invert_;

public:
  typedef std::__state<_CharT> __state;

  _LIBCPP_HIDE_FROM_ABI explicit __word_boundary(const _Traits& __traits, bool __invert, __node<_CharT>* __s)
      : base(__s), __traits_(__traits), __invert_(__invert) {}

  _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const;
};

template <class _CharT, class _Traits>
void __word_boundary<_CharT, _Traits>::__exec(__state& __s) const {
  bool __is_word_b = false;
  if (__s.__first_ != __s.__last_) {
    if (__s.__current_ == __s.__last_) {
      if (!(__s.__flags_ & regex_constants::match_not_eow)) {
        _CharT __c  = __s.__current_[-1];
        __is_word_b = __c == '_' || __traits_.isctype(__c, ctype_base::alnum);
      }
    } else if (__s.__current_ == __s.__first_ && !(__s.__flags_ & regex_constants::match_prev_avail)) {
      if (!(__s.__flags_ & regex_constants::match_not_bow)) {
        _CharT __c  = *__s.__current_;
        __is_word_b = __c == '_' || __traits_.isctype(__c, ctype_base::alnum);
      }
    } else {
      _CharT __c1    = __s.__current_[-1];
      _CharT __c2    = *__s.__current_;
      bool __is_c1_b = __c1 == '_' || __traits_.isctype(__c1, ctype_base::alnum);
      bool __is_c2_b = __c2 == '_' || __traits_.isctype(__c2, ctype_base::alnum);
      __is_word_b    = __is_c1_b != __is_c2_b;
    }
  }
  if (__is_word_b != __invert_) {
    __s.__do_   = __state::__accept_but_not_consume;
    __s.__node_ = this->first();
  } else {
    __s.__do_   = __state::__reject;
    __s.__node_ = nullptr;
  }
}

// __l_anchor

template <class _CharT>
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool __is_eol(_CharT __c) {
  return __c == '\r' || __c == '\n';
}

template <class _CharT>
class __l_anchor_multiline : public __owns_one_state<_CharT> {
  typedef __owns_one_state<_CharT> base;

  bool __multiline_;

public:
  typedef std::__state<_CharT> __state;

  _LIBCPP_HIDE_FROM_ABI __l_anchor_multiline(bool __multiline, __node<_CharT>* __s)
      : base(__s), __multiline_(__multiline) {}

  _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const;
};

template <class _CharT>
void __l_anchor_multiline<_CharT>::__exec(__state& __s) const {
  if (__s.__at_first_ && __s.__current_ == __s.__first_ && !(__s.__flags_ & regex_constants::match_not_bol)) {
    __s.__do_   = __state::__accept_but_not_consume;
    __s.__node_ = this->first();
  } else if (__multiline_ && !__s.__at_first_ && std::__is_eol(*std::prev(__s.__current_))) {
    __s.__do_   = __state::__accept_but_not_consume;
    __s.__node_ = this->first();
  } else {
    __s.__do_   = __state::__reject;
    __s.__node_ = nullptr;
  }
}

// __r_anchor

template <class _CharT>
class __r_anchor_multiline : public __owns_one_state<_CharT> {
  typedef __owns_one_state<_CharT> base;

  bool __multiline_;

public:
  typedef std::__state<_CharT> __state;

  _LIBCPP_HIDE_FROM_ABI __r_anchor_multiline(bool __multiline, __node<_CharT>* __s)
      : base(__s), __multiline_(__multiline) {}

  _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const;
};

template <class _CharT>
void __r_anchor_multiline<_CharT>::__exec(__state& __s) const {
  if (__s.__current_ == __s.__last_ && !(__s.__flags_ & regex_constants::match_not_eol)) {
    __s.__do_   = __state::__accept_but_not_consume;
    __s.__node_ = this->first();
  } else if (__multiline_ && std::__is_eol(*__s.__current_)) {
    __s.__do_   = __state::__accept_but_not_consume;
    __s.__node_ = this->first();
  } else {
    __s.__do_   = __state::__reject;
    __s.__node_ = nullptr;
  }
}

// __match_any

template <class _CharT>
class __match_any : public __owns_one_state<_CharT> {
  typedef __owns_one_state<_CharT> base;

public:
  typedef std::__state<_CharT> __state;

  _LIBCPP_HIDE_FROM_ABI __match_any(__node<_CharT>* __s) : base(__s) {}

  _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const;
};

template <class _CharT>
void __match_any<_CharT>::__exec(__state& __s) const {
  if (__s.__current_ != __s.__last_ && *__s.__current_ != 0) {
    __s.__do_ = __state::__accept_and_consume;
    ++__s.__current_;
    __s.__node_ = this->first();
  } else {
    __s.__do_   = __state::__reject;
    __s.__node_ = nullptr;
  }
}

// __match_any_but_newline

template <class _CharT>
class __match_any_but_newline : public __owns_one_state<_CharT> {
  typedef __owns_one_state<_CharT> base;

public:
  typedef std::__state<_CharT> __state;

  _LIBCPP_HIDE_FROM_ABI __match_any_but_newline(__node<_CharT>* __s) : base(__s) {}

  void __exec(__state&) const override;
};

template <>
_LIBCPP_EXPORTED_FROM_ABI void __match_any_but_newline<char>::__exec(__state&) const;
#if _LIBCPP_HAS_WIDE_CHARACTERS
template <>
_LIBCPP_EXPORTED_FROM_ABI void __match_any_but_newline<wchar_t>::__exec(__state&) const;
#endif

// __match_char

template <class _CharT>
class __match_char : public __owns_one_state<_CharT> {
  typedef __owns_one_state<_CharT> base;

  _CharT __c_;

public:
  typedef std::__state<_CharT> __state;

  _LIBCPP_HIDE_FROM_ABI __match_char(_CharT __c, __node<_CharT>* __s) : base(__s), __c_(__c) {}

  __match_char(const __match_char&)            = delete;
  __match_char& operator=(const __match_char&) = delete;

  _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const;
};

template <class _CharT>
void __match_char<_CharT>::__exec(__state& __s) const {
  if (__s.__current_ != __s.__last_ && *__s.__current_ == __c_) {
    __s.__do_ = __state::__accept_and_consume;
    ++__s.__current_;
    __s.__node_ = this->first();
  } else {
    __s.__do_   = __state::__reject;
    __s.__node_ = nullptr;
  }
}

// __match_char_icase

template <class _CharT, class _Traits>
class __match_char_icase : public __owns_one_state<_CharT> {
  typedef __owns_one_state<_CharT> base;

  _Traits __traits_;
  _CharT __c_;

public:
  typedef std::__state<_CharT> __state;

  _LIBCPP_HIDE_FROM_ABI __match_char_icase(const _Traits& __traits, _CharT __c, __node<_CharT>* __s)
      : base(__s), __traits_(__traits), __c_(__traits.translate_nocase(__c)) {}

  __match_char_icase(const __match_char_icase&)            = delete;
  __match_char_icase& operator=(const __match_char_icase&) = delete;

  _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const;
};

template <class _CharT, class _Traits>
void __match_char_icase<_CharT, _Traits>::__exec(__state& __s) const {
  if (__s.__current_ != __s.__last_ && __traits_.translate_nocase(*__s.__current_) == __c_) {
    __s.__do_ = __state::__accept_and_consume;
    ++__s.__current_;
    __s.__node_ = this->first();
  } else {
    __s.__do_   = __state::__reject;
    __s.__node_ = nullptr;
  }
}

// __match_char_collate

template <class _CharT, class _Traits>
class __match_char_collate : public __owns_one_state<_CharT> {
  typedef __owns_one_state<_CharT> base;

  _Traits __traits_;
  _CharT __c_;

public:
  typedef std::__state<_CharT> __state;

  _LIBCPP_HIDE_FROM_ABI __match_char_collate(const _Traits& __traits, _CharT __c, __node<_CharT>* __s)
      : base(__s), __traits_(__traits), __c_(__traits.translate(__c)) {}

  __match_char_collate(const __match_char_collate&)            = delete;
  __match_char_collate& operator=(const __match_char_collate&) = delete;

  _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const;
};

template <class _CharT, class _Traits>
void __match_char_collate<_CharT, _Traits>::__exec(__state& __s) const {
  if (__s.__current_ != __s.__last_ && __traits_.translate(*__s.__current_) == __c_) {
    __s.__do_ = __state::__accept_and_consume;
    ++__s.__current_;
    __s.__node_ = this->first();
  } else {
    __s.__do_   = __state::__reject;
    __s.__node_ = nullptr;
  }
}

// __bracket_expression

template <class _CharT, class _Traits>
class __bracket_expression : public __owns_one_state<_CharT> {
  typedef __owns_one_state<_CharT> base;
  typedef typename _Traits::string_type string_type;

  _Traits __traits_;
  vector<_CharT> __chars_;
  vector<_CharT> __neg_chars_;
  vector<pair<string_type, string_type> > __ranges_;
  vector<pair<_CharT, _CharT> > __digraphs_;
  vector<string_type> __equivalences_;
  typename regex_traits<_CharT>::char_class_type __mask_;
  typename regex_traits<_CharT>::char_class_type __neg_mask_;
  bool __negate_;
  bool __icase_;
  bool __collate_;
  bool __might_have_digraph_;

public:
  typedef std::__state<_CharT> __state;

  _LIBCPP_HIDE_FROM_ABI
  __bracket_expression(const _Traits& __traits, __node<_CharT>* __s, bool __negate, bool __icase, bool __collate)
      : base(__s),
        __traits_(__traits),
        __mask_(),
        __neg_mask_(),
        __negate_(__negate),
        __icase_(__icase),
        __collate_(__collate),
        __might_have_digraph_(__traits_.getloc().name() != "C") {}

  __bracket_expression(const __bracket_expression&)            = delete;
  __bracket_expression& operator=(const __bracket_expression&) = delete;

  _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const;

  _LIBCPP_HIDE_FROM_ABI bool __negated() const { return __negate_; }

  _LIBCPP_HIDE_FROM_ABI void __add_char(_CharT __c) {
    if (__icase_)
      __chars_.push_back(__traits_.translate_nocase(__c));
    else if (__collate_)
      __chars_.push_back(__traits_.translate(__c));
    else
      __chars_.push_back(__c);
  }
  _LIBCPP_HIDE_FROM_ABI void __add_neg_char(_CharT __c) {
    if (__icase_)
      __neg_chars_.push_back(__traits_.translate_nocase(__c));
    else if (__collate_)
      __neg_chars_.push_back(__traits_.translate(__c));
    else
      __neg_chars_.push_back(__c);
  }
  _LIBCPP_HIDE_FROM_ABI void __add_range(string_type __b, string_type __e) {
    if (__collate_) {
      if (__icase_) {
        for (size_t __i = 0; __i < __b.size(); ++__i)
          __b[__i] = __traits_.translate_nocase(__b[__i]);
        for (size_t __i = 0; __i < __e.size(); ++__i)
          __e[__i] = __traits_.translate_nocase(__e[__i]);
      } else {
        for (size_t __i = 0; __i < __b.size(); ++__i)
          __b[__i] = __traits_.translate(__b[__i]);
        for (size_t __i = 0; __i < __e.size(); ++__i)
          __e[__i] = __traits_.translate(__e[__i]);
      }
      __ranges_.push_back(
          std::make_pair(__traits_.transform(__b.begin(), __b.end()), __traits_.transform(__e.begin(), __e.end())));
    } else {
      if (__b.size() != 1 || __e.size() != 1)
        __throw_regex_error<regex_constants::error_range>();
      if (__icase_) {
        __b[0] = __traits_.translate_nocase(__b[0]);
        __e[0] = __traits_.translate_nocase(__e[0]);
      }
      __ranges_.push_back(std::make_pair(std::move(__b), std::move(__e)));
    }
  }
  _LIBCPP_HIDE_FROM_ABI void __add_digraph(_CharT __c1, _CharT __c2) {
    if (__icase_)
      __digraphs_.push_back(std::make_pair(__traits_.translate_nocase(__c1), __traits_.translate_nocase(__c2)));
    else if (__collate_)
      __digraphs_.push_back(std::make_pair(__traits_.translate(__c1), __traits_.translate(__c2)));
    else
      __digraphs_.push_back(std::make_pair(__c1, __c2));
  }
  _LIBCPP_HIDE_FROM_ABI void __add_equivalence(const string_type& __s) { __equivalences_.push_back(__s); }
  _LIBCPP_HIDE_FROM_ABI void __add_class(typename regex_traits<_CharT>::char_class_type __mask) { __mask_ |= __mask; }
  _LIBCPP_HIDE_FROM_ABI void __add_neg_class(typename regex_traits<_CharT>::char_class_type __mask) {
    __neg_mask_ |= __mask;
  }
};

template <class _CharT, class _Traits>
void __bracket_expression<_CharT, _Traits>::__exec(__state& __s) const {
  bool __found        = false;
  unsigned __consumed = 0;
  if (__s.__current_ != __s.__last_) {
    ++__consumed;
    if (__might_have_digraph_) {
      const _CharT* __next = std::next(__s.__current_);
      if (__next != __s.__last_) {
        pair<_CharT, _CharT> __ch2(*__s.__current_, *__next);
        if (__icase_) {
          __ch2.first  = __traits_.translate_nocase(__ch2.first);
          __ch2.second = __traits_.translate_nocase(__ch2.second);
        } else if (__collate_) {
          __ch2.first  = __traits_.translate(__ch2.first);
          __ch2.second = __traits_.translate(__ch2.second);
        }
        if (!__traits_.lookup_collatename(&__ch2.first, &__ch2.first + 2).empty()) {
          // __ch2 is a digraph in this locale
          ++__consumed;
          for (size_t __i = 0; __i < __digraphs_.size(); ++__i) {
            if (__ch2 == __digraphs_[__i]) {
              __found = true;
              goto __exit;
            }
          }
          if (__collate_ && !__ranges_.empty()) {
            string_type __s2 = __traits_.transform(&__ch2.first, &__ch2.first + 2);
            for (size_t __i = 0; __i < __ranges_.size(); ++__i) {
              if (__ranges_[__i].first <= __s2 && __s2 <= __ranges_[__i].second) {
                __found = true;
                goto __exit;
              }
            }
          }
          if (!__equivalences_.empty()) {
            string_type __s2 = __traits_.transform_primary(&__ch2.first, &__ch2.first + 2);
            for (size_t __i = 0; __i < __equivalences_.size(); ++__i) {
              if (__s2 == __equivalences_[__i]) {
                __found = true;
                goto __exit;
              }
            }
          }
          if (__traits_.isctype(__ch2.first, __mask_) && __traits_.isctype(__ch2.second, __mask_)) {
            __found = true;
            goto __exit;
          }
          if (!__traits_.isctype(__ch2.first, __neg_mask_) && !__traits_.isctype(__ch2.second, __neg_mask_)) {
            __found = true;
            goto __exit;
          }
          goto __exit;
        }
      }
    }
    // test *__s.__current_ as not a digraph
    _CharT __ch = *__s.__current_;
    if (__icase_)
      __ch = __traits_.translate_nocase(__ch);
    else if (__collate_)
      __ch = __traits_.translate(__ch);
    for (size_t __i = 0; __i < __chars_.size(); ++__i) {
      if (__ch == __chars_[__i]) {
        __found = true;
        goto __exit;
      }
    }
    // When there's at least one of __neg_chars_ and __neg_mask_, the set
    // of "__found" chars is
    //   union(complement(union(__neg_chars_, __neg_mask_)),
    //         other cases...)
    //
    // It doesn't make sense to check this when there are no __neg_chars_
    // and no __neg_mask_.
    if (!(__neg_mask_ == 0 && __neg_chars_.empty())) {
      const bool __in_neg_mask  = __traits_.isctype(__ch, __neg_mask_);
      const bool __in_neg_chars = std::find(__neg_chars_.begin(), __neg_chars_.end(), __ch) != __neg_chars_.end();
      if (!(__in_neg_mask || __in_neg_chars)) {
        __found = true;
        goto __exit;
      }
    }
    if (!__ranges_.empty()) {
      string_type __s2 = __collate_ ? __traits_.transform(&__ch, &__ch + 1) : string_type(1, __ch);
      for (size_t __i = 0; __i < __ranges_.size(); ++__i) {
        if (__ranges_[__i].first <= __s2 && __s2 <= __ranges_[__i].second) {
          __found = true;
          goto __exit;
        }
      }
    }
    if (!__equivalences_.empty()) {
      string_type __s2 = __traits_.transform_primary(&__ch, &__ch + 1);
      for (size_t __i = 0; __i < __equivalences_.size(); ++__i) {
        if (__s2 == __equivalences_[__i]) {
          __found = true;
          goto __exit;
        }
      }
    }
    if (__traits_.isctype(__ch, __mask_)) {
      __found = true;
      goto __exit;
    }
  } else
    __found = __negate_; // force reject
__exit:
  if (__found != __negate_) {
    __s.__do_ = __state::__accept_and_consume;
    __s.__current_ += __consumed;
    __s.__node_ = this->first();
  } else {
    __s.__do_   = __state::__reject;
    __s.__node_ = nullptr;
  }
}

template <class _CharT, class _Traits>
class __lookahead;

template <class _CharT, class _Traits = regex_traits<_CharT> >
class _LIBCPP_TEMPLATE_VIS basic_regex;

typedef basic_regex<char> regex;
#if _LIBCPP_HAS_WIDE_CHARACTERS
typedef basic_regex<wchar_t> wregex;
#endif

template <class _CharT, class _Traits>
class _LIBCPP_TEMPLATE_VIS _LIBCPP_PREFERRED_NAME(regex)
    _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wregex)) basic_regex {
public:
  // types:
  typedef _CharT value_type;
  typedef _Traits traits_type;
  typedef typename _Traits::string_type string_type;
  typedef regex_constants::syntax_option_type flag_type;
  typedef typename _Traits::locale_type locale_type;

private:
  _Traits __traits_;
  flag_type __flags_;
  unsigned __marked_count_;
  unsigned __loop_count_;
  int __open_count_;
  shared_ptr<__empty_state<_CharT> > __start_;
  __owns_one_state<_CharT>* __end_;

  typedef std::__state<_CharT> __state;
  typedef std::__node<_CharT> __node;

public:
  // constants:
  static const regex_constants::syntax_option_type icase      = regex_constants::icase;
  static const regex_constants::syntax_option_type nosubs     = regex_constants::nosubs;
  static const regex_constants::syntax_option_type optimize   = regex_constants::optimize;
  static const regex_constants::syntax_option_type collate    = regex_constants::collate;
  static const regex_constants::syntax_option_type ECMAScript = regex_constants::ECMAScript;
  static const regex_constants::syntax_option_type basic      = regex_constants::basic;
  static const regex_constants::syntax_option_type extended   = regex_constants::extended;
  static const regex_constants::syntax_option_type awk        = regex_constants::awk;
  static const regex_constants::syntax_option_type grep       = regex_constants::grep;
  static const regex_constants::syntax_option_type egrep      = regex_constants::egrep;
  static const regex_constants::syntax_option_type multiline  = regex_constants::multiline;

  // construct/copy/destroy:
  _LIBCPP_HIDE_FROM_ABI basic_regex()
      : __flags_(regex_constants::ECMAScript),
        __marked_count_(0),
        __loop_count_(0),
        __open_count_(0),
        __end_(nullptr) {}
  _LIBCPP_HIDE_FROM_ABI explicit basic_regex(const value_type* __p, flag_type __f = regex_constants::ECMAScript)
      : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0), __end_(nullptr) {
    __init(__p, __p + __traits_.length(__p));
  }

  _LIBCPP_HIDE_FROM_ABI basic_regex(const value_type* __p, size_t __len, flag_type __f = regex_constants::ECMAScript)
      : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0), __end_(nullptr) {
    __init(__p, __p + __len);
  }

  //     basic_regex(const basic_regex&) = default;
  //     basic_regex(basic_regex&&) = default;
  template <class _ST, class _SA>
  _LIBCPP_HIDE_FROM_ABI explicit basic_regex(const basic_string<value_type, _ST, _SA>& __p,
                                             flag_type __f = regex_constants::ECMAScript)
      : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0), __end_(nullptr) {
    __init(__p.begin(), __p.end());
  }

  template <class _ForwardIterator>
  _LIBCPP_HIDE_FROM_ABI
  basic_regex(_ForwardIterator __first, _ForwardIterator __last, flag_type __f = regex_constants::ECMAScript)
      : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0), __end_(nullptr) {
    __init(__first, __last);
  }
#ifndef _LIBCPP_CXX03_LANG
  _LIBCPP_HIDE_FROM_ABI basic_regex(initializer_list<value_type> __il, flag_type __f = regex_constants::ECMAScript)
      : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0), __end_(nullptr) {
    __init(__il.begin(), __il.end());
  }
#endif // _LIBCPP_CXX03_LANG

  //    ~basic_regex() = default;

  //     basic_regex& operator=(const basic_regex&) = default;
  //     basic_regex& operator=(basic_regex&&) = default;
  _LIBCPP_HIDE_FROM_ABI basic_regex& operator=(const value_type* __p) { return assign(__p); }
#ifndef _LIBCPP_CXX03_LANG
  _LIBCPP_HIDE_FROM_ABI basic_regex& operator=(initializer_list<value_type> __il) { return assign(__il); }
#endif // _LIBCPP_CXX03_LANG
  template <class _ST, class _SA>
  _LIBCPP_HIDE_FROM_ABI basic_regex& operator=(const basic_string<value_type, _ST, _SA>& __p) {
    return assign(__p);
  }

  // assign:
  _LIBCPP_HIDE_FROM_ABI basic_regex& assign(const basic_regex& __that) { return *this = __that; }
#ifndef _LIBCPP_CXX03_LANG
  _LIBCPP_HIDE_FROM_ABI basic_regex& assign(basic_regex&& __that) _NOEXCEPT { return *this = std::move(__that); }
#endif
  _LIBCPP_HIDE_FROM_ABI basic_regex& assign(const value_type* __p, flag_type __f = regex_constants::ECMAScript) {
    return assign(__p, __p + __traits_.length(__p), __f);
  }
  _LIBCPP_HIDE_FROM_ABI basic_regex&
  assign(const value_type* __p, size_t __len, flag_type __f = regex_constants::ECMAScript) {
    return assign(__p, __p + __len, __f);
  }
  template <class _ST, class _SA>
  _LIBCPP_HIDE_FROM_ABI basic_regex&
  assign(const basic_string<value_type, _ST, _SA>& __s, flag_type __f = regex_constants::ECMAScript) {
    return assign(__s.begin(), __s.end(), __f);
  }

  template <class _InputIterator, __enable_if_t<__has_exactly_input_iterator_category<_InputIterator>::value, int> = 0>
  _LIBCPP_HIDE_FROM_ABI basic_regex&
  assign(_InputIterator __first, _InputIterator __last, flag_type __f = regex_constants::ECMAScript) {
    basic_string<_CharT> __t(__first, __last);
    return assign(__t.begin(), __t.end(), __f);
  }

private:
  _LIBCPP_HIDE_FROM_ABI void __member_init(flag_type __f) {
    __flags_        = __f;
    __marked_count_ = 0;
    __loop_count_   = 0;
    __open_count_   = 0;
    __end_          = nullptr;
  }

public:
  template <class _ForwardIterator, __enable_if_t<__has_forward_iterator_category<_ForwardIterator>::value, int> = 0>
  _LIBCPP_HIDE_FROM_ABI basic_regex&
  assign(_ForwardIterator __first, _ForwardIterator __last, flag_type __f = regex_constants::ECMAScript) {
    return assign(basic_regex(__first, __last, __f));
  }

#ifndef _LIBCPP_CXX03_LANG

  _LIBCPP_HIDE_FROM_ABI basic_regex&
  assign(initializer_list<value_type> __il, flag_type __f = regex_constants::ECMAScript) {
    return assign(__il.begin(), __il.end(), __f);
  }

#endif // _LIBCPP_CXX03_LANG

  // const operations:
  _LIBCPP_HIDE_FROM_ABI unsigned mark_count() const { return __marked_count_; }
  _LIBCPP_HIDE_FROM_ABI flag_type flags() const { return __flags_; }

  // locale:
  _LIBCPP_HIDE_FROM_ABI locale_type imbue(locale_type __loc) {
    __member_init(ECMAScript);
    __start_.reset();
    return __traits_.imbue(__loc);
  }
  _LIBCPP_HIDE_FROM_ABI locale_type getloc() const { return __traits_.getloc(); }

  // swap:
  void swap(basic_regex& __r);

private:
  _LIBCPP_HIDE_FROM_ABI unsigned __loop_count() const { return __loop_count_; }

  _LIBCPP_HIDE_FROM_ABI bool __use_multiline() const {
    return __get_grammar(__flags_) == ECMAScript && (__flags_ & multiline);
  }

  template <class _ForwardIterator>
  void __init(_ForwardIterator __first, _ForwardIterator __last);
  template <class _ForwardIterator>
  _ForwardIterator __parse(_ForwardIterator __first, _ForwardIterator __last);
  template <class _ForwardIterator>
  _ForwardIterator __parse_basic_reg_exp(_ForwardIterator __first, _ForwardIterator __last);
  template <class _ForwardIterator>
  _ForwardIterator __parse_RE_expression(_ForwardIterator __first, _ForwardIterator __last);
  template <class _ForwardIterator>
  _ForwardIterator __parse_simple_RE(_ForwardIterator __first, _ForwardIterator __last);
  template <class _ForwardIterator>
  _ForwardIterator __parse_nondupl_RE(_ForwardIterator __first, _ForwardIterator __last);
  template <class _ForwardIterator>
  _ForwardIterator __parse_one_char_or_coll_elem_RE(_ForwardIterator __first, _ForwardIterator __last);
  template <class _ForwardIterator>
  _ForwardIterator __parse_Back_open_paren(_ForwardIterator __first, _ForwardIterator __last);
  template <class _ForwardIterator>
  _ForwardIterator __parse_Back_close_paren(_ForwardIterator __first, _ForwardIterator __last);
  template <class _ForwardIterator>
  _ForwardIterator __parse_Back_open_brace(_ForwardIterator __first, _ForwardIterator __last);
  template <class _ForwardIterator>
  _ForwardIterator __parse_Back_close_brace(_ForwardIterator __first, _ForwardIterator __last);
  template <class _ForwardIterator>
  _ForwardIterator __parse_BACKREF(_ForwardIterator __first, _ForwardIterator __last);
  template <class _ForwardIterator>
  _ForwardIterator __parse_ORD_CHAR(_ForwardIterator __first, _ForwardIterator __last);
  template <class _ForwardIterator>
  _ForwardIterator __parse_QUOTED_CHAR(_ForwardIterator __first, _ForwardIterator __last);
  template <class _ForwardIterator>
  _ForwardIterator __parse_RE_dupl_symbol(
      _ForwardIterator __first,
      _ForwardIterator __last,
      __owns_one_state<_CharT>* __s,
      unsigned __mexp_begin,
      unsigned __mexp_end);
  template <class _ForwardIterator>
  _ForwardIterator __parse_ERE_dupl_symbol(
      _ForwardIterator __first,
      _ForwardIterator __last,
      __owns_one_state<_CharT>* __s,
      unsigned __mexp_begin,
      unsigned __mexp_end);
  template <class _ForwardIterator>
  _ForwardIterator __parse_bracket_expression(_ForwardIterator __first, _ForwardIterator __last);
  template <class _ForwardIterator>
  _ForwardIterator
  __parse_follow_list(_ForwardIterator __first, _ForwardIterator __last, __bracket_expression<_CharT, _Traits>* __ml);
  template <class _ForwardIterator>
  _ForwardIterator __parse_expression_term(
      _ForwardIterator __first, _ForwardIterator __last, __bracket_expression<_CharT, _Traits>* __ml);
  template <class _ForwardIterator>
  _ForwardIterator __parse_equivalence_class(
      _ForwardIterator __first, _ForwardIterator __last, __bracket_expression<_CharT, _Traits>* __ml);
  template <class _ForwardIterator>
  _ForwardIterator __parse_character_class(
      _ForwardIterator __first, _ForwardIterator __last, __bracket_expression<_CharT, _Traits>* __ml);
  template <class _ForwardIterator>
  _ForwardIterator
  __parse_collating_symbol(_ForwardIterator __first, _ForwardIterator __last, basic_string<_CharT>& __col_sym);
  template <class _ForwardIterator>
  _ForwardIterator __parse_DUP_COUNT(_ForwardIterator __first, _ForwardIterator __last, int& __c);
  template <class _ForwardIterator>
  _ForwardIterator __parse_extended_reg_exp(_ForwardIterator __first, _ForwardIterator __last);
  template <class _ForwardIterator>
  _ForwardIterator __parse_ERE_branch(_ForwardIterator __first, _ForwardIterator __last);
  template <class _ForwardIterator>
  _ForwardIterator __parse_ERE_expression(_ForwardIterator __first, _ForwardIterator __last);
  template <class _ForwardIterator>
  _ForwardIterator __parse_one_char_or_coll_elem_ERE(_ForwardIterator __first, _ForwardIterator __last);
  template <class _ForwardIterator>
  _ForwardIterator __parse_ORD_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last);
  template <class _ForwardIterator>
  _ForwardIterator __parse_QUOTED_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last);
  template <class _ForwardIterator>
  _ForwardIterator __parse_ecma_exp(_ForwardIterator __first, _ForwardIterator __last);
  template <class _ForwardIterator>
  _ForwardIterator __parse_alternative(_ForwardIterator __first, _ForwardIterator __last);
  template <class _ForwardIterator>
  _ForwardIterator __parse_term(_ForwardIterator __first, _ForwardIterator __last);
  template <class _ForwardIterator>
  _ForwardIterator __parse_assertion(_ForwardIterator __first, _ForwardIterator __last);
  template <class _ForwardIterator>
  _ForwardIterator __parse_atom(_ForwardIterator __first, _ForwardIterator __last);
  template <class _ForwardIterator>
  _ForwardIterator __parse_atom_escape(_ForwardIterator __first, _ForwardIterator __last);
  template <class _ForwardIterator>
  _ForwardIterator __parse_decimal_escape(_ForwardIterator __first, _ForwardIterator __last);
  template <class _ForwardIterator>
  _ForwardIterator __parse_character_class_escape(_ForwardIterator __first, _ForwardIterator __last);
  template <class _ForwardIterator>
  _ForwardIterator
  __parse_character_escape(_ForwardIterator __first, _ForwardIterator __last, basic_string<_CharT>* __str = nullptr);
  template <class _ForwardIterator>
  _ForwardIterator __parse_pattern_character(_ForwardIterator __first, _ForwardIterator __last);
  template <class _ForwardIterator>
  _ForwardIterator __parse_grep(_ForwardIterator __first, _ForwardIterator __last);
  template <class _ForwardIterator>
  _ForwardIterator __parse_egrep(_ForwardIterator __first, _ForwardIterator __last);
  template <class _ForwardIterator>
  _ForwardIterator __parse_class_escape(
      _ForwardIterator __first,
      _ForwardIterator __last,
      basic_string<_CharT>& __str,
      __bracket_expression<_CharT, _Traits>* __ml);
  template <class _ForwardIterator>
  _ForwardIterator
  __parse_awk_escape(_ForwardIterator __first, _ForwardIterator __last, basic_string<_CharT>* __str = nullptr);

  bool __test_back_ref(_CharT);

  _LIBCPP_HIDE_FROM_ABI void __push_l_anchor();
  void __push_r_anchor();
  void __push_match_any();
  void __push_match_any_but_newline();
  _LIBCPP_HIDE_FROM_ABI void __push_greedy_inf_repeat(
      size_t __min, __owns_one_state<_CharT>* __s, unsigned __mexp_begin = 0, unsigned __mexp_end = 0) {
    __push_loop(__min, numeric_limits<size_t>::max(), __s, __mexp_begin, __mexp_end);
  }
  _LIBCPP_HIDE_FROM_ABI void __push_nongreedy_inf_repeat(
      size_t __min, __owns_one_state<_CharT>* __s, unsigned __mexp_begin = 0, unsigned __mexp_end = 0) {
    __push_loop(__min, numeric_limits<size_t>::max(), __s, __mexp_begin, __mexp_end, false);
  }
  void __push_loop(size_t __min,
                   size_t __max,
                   __owns_one_state<_CharT>* __s,
                   size_t __mexp_begin = 0,
                   size_t __mexp_end   = 0,
                   bool __greedy       = true);
  __bracket_expression<_CharT, _Traits>* __start_matching_list(bool __negate);
  void __push_char(value_type __c);
  void __push_back_ref(int __i);
  void __push_alternation(__owns_one_state<_CharT>* __sa, __owns_one_state<_CharT>* __sb);
  void __push_begin_marked_subexpression();
  void __push_end_marked_subexpression(unsigned);
  void __push_empty();
  void __push_word_boundary(bool);
  void __push_lookahead(const basic_regex&, bool, unsigned);

  template <class _Allocator>
  bool __search(const _CharT* __first,
                const _CharT* __last,
                match_results<const _CharT*, _Allocator>& __m,
                regex_constants::match_flag_type __flags) const;

  template <class _Allocator>
  bool __match_at_start(const _CharT* __first,
                        const _CharT* __last,
                        match_results<const _CharT*, _Allocator>& __m,
                        regex_constants::match_flag_type __flags,
                        bool) const;
  template <class _Allocator>
  bool __match_at_start_ecma(
      const _CharT* __first,
      const _CharT* __last,
      match_results<const _CharT*, _Allocator>& __m,
      regex_constants::match_flag_type __flags,
      bool) const;
  template <class _Allocator>
  bool __match_at_start_posix_nosubs(
      const _CharT* __first,
      const _CharT* __last,
      match_results<const _CharT*, _Allocator>& __m,
      regex_constants::match_flag_type __flags,
      bool) const;
  template <class _Allocator>
  bool __match_at_start_posix_subs(
      const _CharT* __first,
      const _CharT* __last,
      match_results<const _CharT*, _Allocator>& __m,
      regex_constants::match_flag_type __flags,
      bool) const;

  template <class _Bp, class _Ap, class _Cp, class _Tp>
  friend bool
  regex_search(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type);

  template <class _Ap, class _Cp, class _Tp>
  friend bool
  regex_search(const _Cp*,
               const _Cp*,
               match_results<const _Cp*, _Ap>&,
               const basic_regex<_Cp, _Tp>&,
               regex_constants::match_flag_type);

  template <class _Bp, class _Cp, class _Tp>
  friend bool regex_search(_Bp, _Bp, const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type);

  template <class _Cp, class _Tp>
  friend bool regex_search(const _Cp*, const _Cp*, const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type);

  template <class _Cp, class _Ap, class _Tp>
  friend bool regex_search(
      const _Cp*, match_results<const _Cp*, _Ap>&, const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type);

  template <class _ST, class _SA, class _Cp, class _Tp>
  friend bool regex_search(const basic_string<_Cp, _ST, _SA>& __s,
                           const basic_regex<_Cp, _Tp>& __e,
                           regex_constants::match_flag_type __flags);

  template <class _ST, class _SA, class _Ap, class _Cp, class _Tp>
  friend bool regex_search(const basic_string<_Cp, _ST, _SA>& __s,
                           match_results<typename basic_string<_Cp, _ST, _SA>::const_iterator, _Ap>&,
                           const basic_regex<_Cp, _Tp>& __e,
                           regex_constants::match_flag_type __flags);

  template <class _Iter, class _Ap, class _Cp, class _Tp>
  friend bool
  regex_search(__wrap_iter<_Iter> __first,
               __wrap_iter<_Iter> __last,
               match_results<__wrap_iter<_Iter>, _Ap>& __m,
               const basic_regex<_Cp, _Tp>& __e,
               regex_constants::match_flag_type __flags);

  template <class, class>
  friend class __lookahead;
};

#if _LIBCPP_STD_VER >= 17
template <class _ForwardIterator, __enable_if_t<__has_forward_iterator_category<_ForwardIterator>::value, int> = 0>
basic_regex(_ForwardIterator, _ForwardIterator, regex_constants::syntax_option_type = regex_constants::ECMAScript)
    -> basic_regex<typename iterator_traits<_ForwardIterator>::value_type>;
#endif

template <class _CharT, class _Traits>
const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::icase;
template <class _CharT, class _Traits>
const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::nosubs;
template <class _CharT, class _Traits>
const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::optimize;
template <class _CharT, class _Traits>
const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::collate;
template <class _CharT, class _Traits>
const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::ECMAScript;
template <class _CharT, class _Traits>
const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::basic;
template <class _CharT, class _Traits>
const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::extended;
template <class _CharT, class _Traits>
const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::awk;
template <class _CharT, class _Traits>
const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::grep;
template <class _CharT, class _Traits>
const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::egrep;

template <class _CharT, class _Traits>
void basic_regex<_CharT, _Traits>::swap(basic_regex& __r) {
  using std::swap;
  swap(__traits_, __r.__traits_);
  swap(__flags_, __r.__flags_);
  swap(__marked_count_, __r.__marked_count_);
  swap(__loop_count_, __r.__loop_count_);
  swap(__open_count_, __r.__open_count_);
  swap(__start_, __r.__start_);
  swap(__end_, __r.__end_);
}

template <class _CharT, class _Traits>
inline _LIBCPP_HIDE_FROM_ABI void swap(basic_regex<_CharT, _Traits>& __x, basic_regex<_CharT, _Traits>& __y) {
  return __x.swap(__y);
}

// __lookahead

template <class _CharT, class _Traits>
class __lookahead : public __owns_one_state<_CharT> {
  typedef __owns_one_state<_CharT> base;

  basic_regex<_CharT, _Traits> __exp_;
  unsigned __mexp_;
  bool __invert_;

public:
  typedef std::__state<_CharT> __state;

  _LIBCPP_HIDE_FROM_ABI
  __lookahead(const basic_regex<_CharT, _Traits>& __exp, bool __invert, __node<_CharT>* __s, unsigned __mexp)
      : base(__s), __exp_(__exp), __mexp_(__mexp), __invert_(__invert) {}

  __lookahead(const __lookahead&)            = delete;
  __lookahead& operator=(const __lookahead&) = delete;

  _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const;
};

template <class _CharT, class _Traits>
void __lookahead<_CharT, _Traits>::__exec(__state& __s) const {
  match_results<const _CharT*> __m;
  __m.__init(1 + __exp_.mark_count(), __s.__current_, __s.__last_);
  bool __matched = __exp_.__match_at_start_ecma(
      __s.__current_,
      __s.__last_,
      __m,
      (__s.__flags_ | regex_constants::match_continuous) & ~regex_constants::__full_match,
      __s.__at_first_ && __s.__current_ == __s.__first_);
  if (__matched != __invert_) {
    __s.__do_   = __state::__accept_but_not_consume;
    __s.__node_ = this->first();
    for (unsigned __i = 1; __i < __m.size(); ++__i) {
      __s.__sub_matches_[__mexp_ + __i - 1] = __m.__matches_[__i];
    }
  } else {
    __s.__do_   = __state::__reject;
    __s.__node_ = nullptr;
  }
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
void basic_regex<_CharT, _Traits>::__init(_ForwardIterator __first, _ForwardIterator __last) {
  if (__get_grammar(__flags_) == 0)
    __flags_ |= regex_constants::ECMAScript;
  _ForwardIterator __temp = __parse(__first, __last);
  if (__temp != __last)
    __throw_regex_error<regex_constants::__re_err_parse>();
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator basic_regex<_CharT, _Traits>::__parse(_ForwardIterator __first, _ForwardIterator __last) {
  {
    unique_ptr<__node> __h(new __end_state<_CharT>);
    __start_.reset(new __empty_state<_CharT>(__h.get()));
    __h.release();
    __end_ = __start_.get();
  }
  switch (__get_grammar(__flags_)) {
  case ECMAScript:
    __first = __parse_ecma_exp(__first, __last);
    break;
  case basic:
    __first = __parse_basic_reg_exp(__first, __last);
    break;
  case extended:
  case awk:
    __first = __parse_extended_reg_exp(__first, __last);
    break;
  case grep:
    __first = __parse_grep(__first, __last);
    break;
  case egrep:
    __first = __parse_egrep(__first, __last);
    break;
  default:
    __throw_regex_error<regex_constants::__re_err_grammar>();
  }
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator
basic_regex<_CharT, _Traits>::__parse_basic_reg_exp(_ForwardIterator __first, _ForwardIterator __last) {
  if (__first != __last) {
    if (*__first == '^') {
      __push_l_anchor();
      ++__first;
    }
    if (__first != __last) {
      __first = __parse_RE_expression(__first, __last);
      if (__first != __last) {
        _ForwardIterator __temp = std::next(__first);
        if (__temp == __last && *__first == '$') {
          __push_r_anchor();
          ++__first;
        }
      }
    }
    if (__first != __last)
      __throw_regex_error<regex_constants::__re_err_empty>();
  }
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator
basic_regex<_CharT, _Traits>::__parse_extended_reg_exp(_ForwardIterator __first, _ForwardIterator __last) {
  __owns_one_state<_CharT>* __sa = __end_;
  _ForwardIterator __temp        = __parse_ERE_branch(__first, __last);
  if (__temp == __first)
    __throw_regex_error<regex_constants::__re_err_empty>();
  __first = __temp;
  while (__first != __last && *__first == '|') {
    __owns_one_state<_CharT>* __sb = __end_;
    __temp                         = __parse_ERE_branch(++__first, __last);
    if (__temp == __first)
      __throw_regex_error<regex_constants::__re_err_empty>();
    __push_alternation(__sa, __sb);
    __first = __temp;
  }
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator basic_regex<_CharT, _Traits>::__parse_ERE_branch(_ForwardIterator __first, _ForwardIterator __last) {
  _ForwardIterator __temp = __parse_ERE_expression(__first, __last);
  if (__temp == __first)
    __throw_regex_error<regex_constants::__re_err_empty>();
  do {
    __first = __temp;
    __temp  = __parse_ERE_expression(__first, __last);
  } while (__temp != __first);
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator
basic_regex<_CharT, _Traits>::__parse_ERE_expression(_ForwardIterator __first, _ForwardIterator __last) {
  __owns_one_state<_CharT>* __e = __end_;
  unsigned __mexp_begin         = __marked_count_;
  _ForwardIterator __temp       = __parse_one_char_or_coll_elem_ERE(__first, __last);
  if (__temp == __first && __temp != __last) {
    switch (*__temp) {
    case '^':
      __push_l_anchor();
      ++__temp;
      break;
    case '$':
      __push_r_anchor();
      ++__temp;
      break;
    case '(':
      __push_begin_marked_subexpression();
      unsigned __temp_count = __marked_count_;
      ++__open_count_;
      __temp = __parse_extended_reg_exp(++__temp, __last);
      if (__temp == __last || *__temp != ')')
        __throw_regex_error<regex_constants::error_paren>();
      __push_end_marked_subexpression(__temp_count);
      --__open_count_;
      ++__temp;
      break;
    }
  }
  if (__temp != __first)
    __temp = __parse_ERE_dupl_symbol(__temp, __last, __e, __mexp_begin + 1, __marked_count_ + 1);
  __first = __temp;
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator
basic_regex<_CharT, _Traits>::__parse_RE_expression(_ForwardIterator __first, _ForwardIterator __last) {
  while (true) {
    _ForwardIterator __temp = __parse_simple_RE(__first, __last);
    if (__temp == __first)
      break;
    __first = __temp;
  }
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator basic_regex<_CharT, _Traits>::__parse_simple_RE(_ForwardIterator __first, _ForwardIterator __last) {
  if (__first != __last) {
    __owns_one_state<_CharT>* __e = __end_;
    unsigned __mexp_begin         = __marked_count_;
    _ForwardIterator __temp       = __parse_nondupl_RE(__first, __last);
    if (__temp != __first)
      __first = __parse_RE_dupl_symbol(__temp, __last, __e, __mexp_begin + 1, __marked_count_ + 1);
  }
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator basic_regex<_CharT, _Traits>::__parse_nondupl_RE(_ForwardIterator __first, _ForwardIterator __last) {
  _ForwardIterator __temp = __first;
  __first                 = __parse_one_char_or_coll_elem_RE(__first, __last);
  if (__temp == __first) {
    __temp = __parse_Back_open_paren(__first, __last);
    if (__temp != __first) {
      __push_begin_marked_subexpression();
      unsigned __temp_count = __marked_count_;
      __first               = __parse_RE_expression(__temp, __last);
      __temp                = __parse_Back_close_paren(__first, __last);
      if (__temp == __first)
        __throw_regex_error<regex_constants::error_paren>();
      __push_end_marked_subexpression(__temp_count);
      __first = __temp;
    } else
      __first = __parse_BACKREF(__first, __last);
  }
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator
basic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_RE(_ForwardIterator __first, _ForwardIterator __last) {
  _ForwardIterator __temp = __parse_ORD_CHAR(__first, __last);
  if (__temp == __first) {
    __temp = __parse_QUOTED_CHAR(__first, __last);
    if (__temp == __first) {
      if (__temp != __last && *__temp == '.') {
        __push_match_any();
        ++__temp;
      } else
        __temp = __parse_bracket_expression(__first, __last);
    }
  }
  __first = __temp;
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator
basic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_ERE(_ForwardIterator __first, _ForwardIterator __last) {
  _ForwardIterator __temp = __parse_ORD_CHAR_ERE(__first, __last);
  if (__temp == __first) {
    __temp = __parse_QUOTED_CHAR_ERE(__first, __last);
    if (__temp == __first) {
      if (__temp != __last && *__temp == '.') {
        __push_match_any();
        ++__temp;
      } else
        __temp = __parse_bracket_expression(__first, __last);
    }
  }
  __first = __temp;
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator
basic_regex<_CharT, _Traits>::__parse_Back_open_paren(_ForwardIterator __first, _ForwardIterator __last) {
  if (__first != __last) {
    _ForwardIterator __temp = std::next(__first);
    if (__temp != __last) {
      if (*__first == '\\' && *__temp == '(')
        __first = ++__temp;
    }
  }
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator
basic_regex<_CharT, _Traits>::__parse_Back_close_paren(_ForwardIterator __first, _ForwardIterator __last) {
  if (__first != __last) {
    _ForwardIterator __temp = std::next(__first);
    if (__temp != __last) {
      if (*__first == '\\' && *__temp == ')')
        __first = ++__temp;
    }
  }
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator
basic_regex<_CharT, _Traits>::__parse_Back_open_brace(_ForwardIterator __first, _ForwardIterator __last) {
  if (__first != __last) {
    _ForwardIterator __temp = std::next(__first);
    if (__temp != __last) {
      if (*__first == '\\' && *__temp == '{')
        __first = ++__temp;
    }
  }
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator
basic_regex<_CharT, _Traits>::__parse_Back_close_brace(_ForwardIterator __first, _ForwardIterator __last) {
  if (__first != __last) {
    _ForwardIterator __temp = std::next(__first);
    if (__temp != __last) {
      if (*__first == '\\' && *__temp == '}')
        __first = ++__temp;
    }
  }
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator basic_regex<_CharT, _Traits>::__parse_BACKREF(_ForwardIterator __first, _ForwardIterator __last) {
  if (__first != __last) {
    _ForwardIterator __temp = std::next(__first);
    if (__temp != __last && *__first == '\\' && __test_back_ref(*__temp))
      __first = ++__temp;
  }
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator basic_regex<_CharT, _Traits>::__parse_ORD_CHAR(_ForwardIterator __first, _ForwardIterator __last) {
  if (__first != __last) {
    _ForwardIterator __temp = std::next(__first);
    if (__temp == __last && *__first == '$')
      return __first;
    // Not called inside a bracket
    if (*__first == '.' || *__first == '\\' || *__first == '[')
      return __first;
    __push_char(*__first);
    ++__first;
  }
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator basic_regex<_CharT, _Traits>::__parse_ORD_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last) {
  if (__first != __last) {
    switch (*__first) {
    case '^':
    case '.':
    case '[':
    case '$':
    case '(':
    case '|':
    case '*':
    case '+':
    case '?':
    case '{':
    case '\\':
      break;
    case ')':
      if (__open_count_ == 0) {
        __push_char(*__first);
        ++__first;
      }
      break;
    default:
      __push_char(*__first);
      ++__first;
      break;
    }
  }
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR(_ForwardIterator __first, _ForwardIterator __last) {
  if (__first != __last) {
    _ForwardIterator __temp = std::next(__first);
    if (__temp != __last) {
      if (*__first == '\\') {
        switch (*__temp) {
        case '^':
        case '.':
        case '*':
        case '[':
        case '$':
        case '\\':
          __push_char(*__temp);
          __first = ++__temp;
          break;
        }
      }
    }
  }
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator
basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last) {
  if (__first != __last) {
    _ForwardIterator __temp = std::next(__first);
    if (__temp != __last) {
      if (*__first == '\\') {
        switch (*__temp) {
        case '^':
        case '.':
        case '*':
        case '[':
        case '$':
        case '\\':
        case '(':
        case ')':
        case '|':
        case '+':
        case '?':
        case '{':
        case '}':
          __push_char(*__temp);
          __first = ++__temp;
          break;
        default:
          if (__get_grammar(__flags_) == awk)
            __first = __parse_awk_escape(++__first, __last);
          else if (__test_back_ref(*__temp))
            __first = ++__temp;
          break;
        }
      }
    }
  }
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator basic_regex<_CharT, _Traits>::__parse_RE_dupl_symbol(
    _ForwardIterator __first,
    _ForwardIterator __last,
    __owns_one_state<_CharT>* __s,
    unsigned __mexp_begin,
    unsigned __mexp_end) {
  if (__first != __last) {
    if (*__first == '*') {
      __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
      ++__first;
    } else {
      _ForwardIterator __temp = __parse_Back_open_brace(__first, __last);
      if (__temp != __first) {
        int __min = 0;
        __first   = __temp;
        __temp    = __parse_DUP_COUNT(__first, __last, __min);
        if (__temp == __first)
          __throw_regex_error<regex_constants::error_badbrace>();
        __first = __temp;
        if (__first == __last)
          __throw_regex_error<regex_constants::error_brace>();
        if (*__first != ',') {
          __temp = __parse_Back_close_brace(__first, __last);
          if (__temp == __first)
            __throw_regex_error<regex_constants::error_brace>();
          __push_loop(__min, __min, __s, __mexp_begin, __mexp_end, true);
          __first = __temp;
        } else {
          ++__first; // consume ','
          int __max = -1;
          __first   = __parse_DUP_COUNT(__first, __last, __max);
          __temp    = __parse_Back_close_brace(__first, __last);
          if (__temp == __first)
            __throw_regex_error<regex_constants::error_brace>();
          if (__max == -1)
            __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
          else {
            if (__max < __min)
              __throw_regex_error<regex_constants::error_badbrace>();
            __push_loop(__min, __max, __s, __mexp_begin, __mexp_end, true);
          }
          __first = __temp;
        }
      }
    }
  }
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator basic_regex<_CharT, _Traits>::__parse_ERE_dupl_symbol(
    _ForwardIterator __first,
    _ForwardIterator __last,
    __owns_one_state<_CharT>* __s,
    unsigned __mexp_begin,
    unsigned __mexp_end) {
  if (__first != __last) {
    unsigned __grammar = __get_grammar(__flags_);
    switch (*__first) {
    case '*':
      ++__first;
      if (__grammar == ECMAScript && __first != __last && *__first == '?') {
        ++__first;
        __push_nongreedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
      } else
        __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
      break;
    case '+':
      ++__first;
      if (__grammar == ECMAScript && __first != __last && *__first == '?') {
        ++__first;
        __push_nongreedy_inf_repeat(1, __s, __mexp_begin, __mexp_end);
      } else
        __push_greedy_inf_repeat(1, __s, __mexp_begin, __mexp_end);
      break;
    case '?':
      ++__first;
      if (__grammar == ECMAScript && __first != __last && *__first == '?') {
        ++__first;
        __push_loop(0, 1, __s, __mexp_begin, __mexp_end, false);
      } else
        __push_loop(0, 1, __s, __mexp_begin, __mexp_end);
      break;
    case '{': {
      int __min;
      _ForwardIterator __temp = __parse_DUP_COUNT(++__first, __last, __min);
      if (__temp == __first)
        __throw_regex_error<regex_constants::error_badbrace>();
      __first = __temp;
      if (__first == __last)
        __throw_regex_error<regex_constants::error_brace>();
      switch (*__first) {
      case '}':
        ++__first;
        if (__grammar == ECMAScript && __first != __last && *__first == '?') {
          ++__first;
          __push_loop(__min, __min, __s, __mexp_begin, __mexp_end, false);
        } else
          __push_loop(__min, __min, __s, __mexp_begin, __mexp_end);
        break;
      case ',':
        ++__first;
        if (__first == __last)
          __throw_regex_error<regex_constants::error_badbrace>();
        if (*__first == '}') {
          ++__first;
          if (__grammar == ECMAScript && __first != __last && *__first == '?') {
            ++__first;
            __push_nongreedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
          } else
            __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
        } else {
          int __max = -1;
          __temp    = __parse_DUP_COUNT(__first, __last, __max);
          if (__temp == __first)
            __throw_regex_error<regex_constants::error_brace>();
          __first = __temp;
          if (__first == __last || *__first != '}')
            __throw_regex_error<regex_constants::error_brace>();
          ++__first;
          if (__max < __min)
            __throw_regex_error<regex_constants::error_badbrace>();
          if (__grammar == ECMAScript && __first != __last && *__first == '?') {
            ++__first;
            __push_loop(__min, __max, __s, __mexp_begin, __mexp_end, false);
          } else
            __push_loop(__min, __max, __s, __mexp_begin, __mexp_end);
        }
        break;
      default:
        __throw_regex_error<regex_constants::error_badbrace>();
      }
    } break;
    }
  }
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator
basic_regex<_CharT, _Traits>::__parse_bracket_expression(_ForwardIterator __first, _ForwardIterator __last) {
  if (__first != __last && *__first == '[') {
    ++__first;
    if (__first == __last)
      __throw_regex_error<regex_constants::error_brack>();
    bool __negate = false;
    if (*__first == '^') {
      ++__first;
      __negate = true;
    }
    __bracket_expression<_CharT, _Traits>* __ml = __start_matching_list(__negate);
    // __ml owned by *this
    if (__first == __last)
      __throw_regex_error<regex_constants::error_brack>();
    if (__get_grammar(__flags_) != ECMAScript && *__first == ']') {
      __ml->__add_char(']');
      ++__first;
    }
    __first = __parse_follow_list(__first, __last, __ml);
    if (__first == __last)
      __throw_regex_error<regex_constants::error_brack>();
    if (*__first == '-') {
      __ml->__add_char('-');
      ++__first;
    }
    if (__first == __last || *__first != ']')
      __throw_regex_error<regex_constants::error_brack>();
    ++__first;
  }
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator basic_regex<_CharT, _Traits>::__parse_follow_list(
    _ForwardIterator __first, _ForwardIterator __last, __bracket_expression<_CharT, _Traits>* __ml) {
  if (__first != __last) {
    while (true) {
      _ForwardIterator __temp = __parse_expression_term(__first, __last, __ml);
      if (__temp == __first)
        break;
      __first = __temp;
    }
  }
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator basic_regex<_CharT, _Traits>::__parse_expression_term(
    _ForwardIterator __first, _ForwardIterator __last, __bracket_expression<_CharT, _Traits>* __ml) {
  if (__first != __last && *__first != ']') {
    _ForwardIterator __temp = std::next(__first);
    basic_string<_CharT> __start_range;
    if (__temp != __last && *__first == '[') {
      if (*__temp == '=')
        return __parse_equivalence_class(++__temp, __last, __ml);
      else if (*__temp == ':')
        return __parse_character_class(++__temp, __last, __ml);
      else if (*__temp == '.')
        __first = __parse_collating_symbol(++__temp, __last, __start_range);
    }
    unsigned __grammar = __get_grammar(__flags_);
    if (__start_range.empty()) {
      if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\') {
        if (__grammar == ECMAScript)
          __first = __parse_class_escape(++__first, __last, __start_range, __ml);
        else
          __first = __parse_awk_escape(++__first, __last, &__start_range);
      } else {
        __start_range = *__first;
        ++__first;
      }
    }
    if (__first != __last && *__first != ']') {
      __temp = std::next(__first);
      if (__temp != __last && *__first == '-' && *__temp != ']') {
        // parse a range
        basic_string<_CharT> __end_range;
        __first = __temp;
        ++__temp;
        if (__temp != __last && *__first == '[' && *__temp == '.')
          __first = __parse_collating_symbol(++__temp, __last, __end_range);
        else {
          if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\') {
            if (__grammar == ECMAScript)
              __first = __parse_class_escape(++__first, __last, __end_range, __ml);
            else
              __first = __parse_awk_escape(++__first, __last, &__end_range);
          } else {
            __end_range = *__first;
            ++__first;
          }
        }
        __ml->__add_range(std::move(__start_range), std::move(__end_range));
      } else if (!__start_range.empty()) {
        if (__start_range.size() == 1)
          __ml->__add_char(__start_range[0]);
        else
          __ml->__add_digraph(__start_range[0], __start_range[1]);
      }
    } else if (!__start_range.empty()) {
      if (__start_range.size() == 1)
        __ml->__add_char(__start_range[0]);
      else
        __ml->__add_digraph(__start_range[0], __start_range[1]);
    }
  }
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator basic_regex<_CharT, _Traits>::__parse_class_escape(
    _ForwardIterator __first,
    _ForwardIterator __last,
    basic_string<_CharT>& __str,
    __bracket_expression<_CharT, _Traits>* __ml) {
  if (__first == __last)
    __throw_regex_error<regex_constants::error_escape>();
  switch (*__first) {
  case 0:
    __str = *__first;
    return ++__first;
  case 'b':
    __str = _CharT(8);
    return ++__first;
  case 'd':
    __ml->__add_class(ctype_base::digit);
    return ++__first;
  case 'D':
    __ml->__add_neg_class(ctype_base::digit);
    return ++__first;
  case 's':
    __ml->__add_class(ctype_base::space);
    return ++__first;
  case 'S':
    __ml->__add_neg_class(ctype_base::space);
    return ++__first;
  case 'w':
    __ml->__add_class(ctype_base::alnum);
    __ml->__add_char('_');
    return ++__first;
  case 'W':
    __ml->__add_neg_class(ctype_base::alnum);
    __ml->__add_neg_char('_');
    return ++__first;
  }
  __first = __parse_character_escape(__first, __last, &__str);
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator basic_regex<_CharT, _Traits>::__parse_awk_escape(
    _ForwardIterator __first, _ForwardIterator __last, basic_string<_CharT>* __str) {
  if (__first == __last)
    __throw_regex_error<regex_constants::error_escape>();
  switch (*__first) {
  case '\\':
  case '"':
  case '/':
    if (__str)
      *__str = *__first;
    else
      __push_char(*__first);
    return ++__first;
  case 'a':
    if (__str)
      *__str = _CharT(7);
    else
      __push_char(_CharT(7));
    return ++__first;
  case 'b':
    if (__str)
      *__str = _CharT(8);
    else
      __push_char(_CharT(8));
    return ++__first;
  case 'f':
    if (__str)
      *__str = _CharT(0xC);
    else
      __push_char(_CharT(0xC));
    return ++__first;
  case 'n':
    if (__str)
      *__str = _CharT(0xA);
    else
      __push_char(_CharT(0xA));
    return ++__first;
  case 'r':
    if (__str)
      *__str = _CharT(0xD);
    else
      __push_char(_CharT(0xD));
    return ++__first;
  case 't':
    if (__str)
      *__str = _CharT(0x9);
    else
      __push_char(_CharT(0x9));
    return ++__first;
  case 'v':
    if (__str)
      *__str = _CharT(0xB);
    else
      __push_char(_CharT(0xB));
    return ++__first;
  }
  if ('0' <= *__first && *__first <= '7') {
    unsigned __val = *__first - '0';
    if (++__first != __last && ('0' <= *__first && *__first <= '7')) {
      __val = 8 * __val + *__first - '0';
      if (++__first != __last && ('0' <= *__first && *__first <= '7'))
        __val = 8 * __val + *__first++ - '0';
    }
    if (__str)
      *__str = _CharT(__val);
    else
      __push_char(_CharT(__val));
  } else
    __throw_regex_error<regex_constants::error_escape>();
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator basic_regex<_CharT, _Traits>::__parse_equivalence_class(
    _ForwardIterator __first, _ForwardIterator __last, __bracket_expression<_CharT, _Traits>* __ml) {
  // Found [=
  //   This means =] must exist
  value_type __equal_close[2] = {'=', ']'};
  _ForwardIterator __temp     = std::search(__first, __last, __equal_close, __equal_close + 2);
  if (__temp == __last)
    __throw_regex_error<regex_constants::error_brack>();
  // [__first, __temp) contains all text in [= ... =]
  string_type __collate_name = __traits_.lookup_collatename(__first, __temp);
  if (__collate_name.empty())
    __throw_regex_error<regex_constants::error_collate>();
  string_type __equiv_name = __traits_.transform_primary(__collate_name.begin(), __collate_name.end());
  if (!__equiv_name.empty())
    __ml->__add_equivalence(__equiv_name);
  else {
    switch (__collate_name.size()) {
    case 1:
      __ml->__add_char(__collate_name[0]);
      break;
    case 2:
      __ml->__add_digraph(__collate_name[0], __collate_name[1]);
      break;
    default:
      __throw_regex_error<regex_constants::error_collate>();
    }
  }
  __first = std::next(__temp, 2);
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator basic_regex<_CharT, _Traits>::__parse_character_class(
    _ForwardIterator __first, _ForwardIterator __last, __bracket_expression<_CharT, _Traits>* __ml) {
  // Found [:
  //   This means :] must exist
  value_type __colon_close[2] = {':', ']'};
  _ForwardIterator __temp     = std::search(__first, __last, __colon_close, __colon_close + 2);
  if (__temp == __last)
    __throw_regex_error<regex_constants::error_brack>();
  // [__first, __temp) contains all text in [: ... :]
  typedef typename _Traits::char_class_type char_class_type;
  char_class_type __class_type = __traits_.lookup_classname(__first, __temp, __flags_ & icase);
  if (__class_type == 0)
    __throw_regex_error<regex_constants::error_ctype>();
  __ml->__add_class(__class_type);
  __first = std::next(__temp, 2);
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator basic_regex<_CharT, _Traits>::__parse_collating_symbol(
    _ForwardIterator __first, _ForwardIterator __last, basic_string<_CharT>& __col_sym) {
  // Found [.
  //   This means .] must exist
  value_type __dot_close[2] = {'.', ']'};
  _ForwardIterator __temp   = std::search(__first, __last, __dot_close, __dot_close + 2);
  if (__temp == __last)
    __throw_regex_error<regex_constants::error_brack>();
  // [__first, __temp) contains all text in [. ... .]
  __col_sym = __traits_.lookup_collatename(__first, __temp);
  switch (__col_sym.size()) {
  case 1:
  case 2:
    break;
  default:
    __throw_regex_error<regex_constants::error_collate>();
  }
  __first = std::next(__temp, 2);
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator
basic_regex<_CharT, _Traits>::__parse_DUP_COUNT(_ForwardIterator __first, _ForwardIterator __last, int& __c) {
  if (__first != __last) {
    int __val = __traits_.value(*__first, 10);
    if (__val != -1) {
      __c = __val;
      for (++__first; __first != __last && (__val = __traits_.value(*__first, 10)) != -1; ++__first) {
        if (__c >= numeric_limits<int>::max() / 10)
          __throw_regex_error<regex_constants::error_badbrace>();
        __c *= 10;
        __c += __val;
      }
    }
  }
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator basic_regex<_CharT, _Traits>::__parse_ecma_exp(_ForwardIterator __first, _ForwardIterator __last) {
  __owns_one_state<_CharT>* __sa = __end_;
  _ForwardIterator __temp        = __parse_alternative(__first, __last);
  if (__temp == __first)
    __push_empty();
  __first = __temp;
  while (__first != __last && *__first == '|') {
    __owns_one_state<_CharT>* __sb = __end_;
    __temp                         = __parse_alternative(++__first, __last);
    if (__temp == __first)
      __push_empty();
    __push_alternation(__sa, __sb);
    __first = __temp;
  }
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator basic_regex<_CharT, _Traits>::__parse_alternative(_ForwardIterator __first, _ForwardIterator __last) {
  while (true) {
    _ForwardIterator __temp = __parse_term(__first, __last);
    if (__temp == __first)
      break;
    __first = __temp;
  }
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator basic_regex<_CharT, _Traits>::__parse_term(_ForwardIterator __first, _ForwardIterator __last) {
  _ForwardIterator __temp = __parse_assertion(__first, __last);
  if (__temp == __first) {
    __owns_one_state<_CharT>* __e = __end_;
    unsigned __mexp_begin         = __marked_count_;
    __temp                        = __parse_atom(__first, __last);
    if (__temp != __first)
      __first = __parse_ERE_dupl_symbol(__temp, __last, __e, __mexp_begin + 1, __marked_count_ + 1);
  } else
    __first = __temp;
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator basic_regex<_CharT, _Traits>::__parse_assertion(_ForwardIterator __first, _ForwardIterator __last) {
  if (__first != __last) {
    switch (*__first) {
    case '^':
      __push_l_anchor();
      ++__first;
      break;
    case '$':
      __push_r_anchor();
      ++__first;
      break;
    case '\\': {
      _ForwardIterator __temp = std::next(__first);
      if (__temp != __last) {
        if (*__temp == 'b') {
          __push_word_boundary(false);
          __first = ++__temp;
        } else if (*__temp == 'B') {
          __push_word_boundary(true);
          __first = ++__temp;
        }
      }
    } break;
    case '(': {
      _ForwardIterator __temp = std::next(__first);
      if (__temp != __last && *__temp == '?') {
        if (++__temp != __last) {
          switch (*__temp) {
          case '=': {
            basic_regex __exp;
            __exp.__flags_  = __flags_;
            __temp          = __exp.__parse(++__temp, __last);
            unsigned __mexp = __exp.__marked_count_;
            __push_lookahead(std::move(__exp), false, __marked_count_);
            __marked_count_ += __mexp;
            if (__temp == __last || *__temp != ')')
              __throw_regex_error<regex_constants::error_paren>();
            __first = ++__temp;
          } break;
          case '!': {
            basic_regex __exp;
            __exp.__flags_  = __flags_;
            __temp          = __exp.__parse(++__temp, __last);
            unsigned __mexp = __exp.__marked_count_;
            __push_lookahead(std::move(__exp), true, __marked_count_);
            __marked_count_ += __mexp;
            if (__temp == __last || *__temp != ')')
              __throw_regex_error<regex_constants::error_paren>();
            __first = ++__temp;
          } break;
          }
        }
      }
    } break;
    }
  }
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator basic_regex<_CharT, _Traits>::__parse_atom(_ForwardIterator __first, _ForwardIterator __last) {
  if (__first != __last) {
    switch (*__first) {
    case '.':
      __push_match_any_but_newline();
      ++__first;
      break;
    case '\\':
      __first = __parse_atom_escape(__first, __last);
      break;
    case '[':
      __first = __parse_bracket_expression(__first, __last);
      break;
    case '(': {
      ++__first;
      if (__first == __last)
        __throw_regex_error<regex_constants::error_paren>();
      _ForwardIterator __temp = std::next(__first);
      if (__temp != __last && *__first == '?' && *__temp == ':') {
        ++__open_count_;
        __first = __parse_ecma_exp(++__temp, __last);
        if (__first == __last || *__first != ')')
          __throw_regex_error<regex_constants::error_paren>();
        --__open_count_;
        ++__first;
      } else {
        __push_begin_marked_subexpression();
        unsigned __temp_count = __marked_count_;
        ++__open_count_;
        __first = __parse_ecma_exp(__first, __last);
        if (__first == __last || *__first != ')')
          __throw_regex_error<regex_constants::error_paren>();
        __push_end_marked_subexpression(__temp_count);
        --__open_count_;
        ++__first;
      }
    } break;
    case '*':
    case '+':
    case '?':
    case '{':
      __throw_regex_error<regex_constants::error_badrepeat>();
      break;
    default:
      __first = __parse_pattern_character(__first, __last);
      break;
    }
  }
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator basic_regex<_CharT, _Traits>::__parse_atom_escape(_ForwardIterator __first, _ForwardIterator __last) {
  if (__first != __last && *__first == '\\') {
    _ForwardIterator __t1 = std::next(__first);
    if (__t1 == __last)
      __throw_regex_error<regex_constants::error_escape>();

    _ForwardIterator __t2 = __parse_decimal_escape(__t1, __last);
    if (__t2 != __t1)
      __first = __t2;
    else {
      __t2 = __parse_character_class_escape(__t1, __last);
      if (__t2 != __t1)
        __first = __t2;
      else {
        __t2 = __parse_character_escape(__t1, __last);
        if (__t2 != __t1)
          __first = __t2;
      }
    }
  }
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator
basic_regex<_CharT, _Traits>::__parse_decimal_escape(_ForwardIterator __first, _ForwardIterator __last) {
  if (__first != __last) {
    if (*__first == '0') {
      __push_char(_CharT());
      ++__first;
    } else if ('1' <= *__first && *__first <= '9') {
      unsigned __v = *__first - '0';
      for (++__first; __first != __last && '0' <= *__first && *__first <= '9'; ++__first) {
        if (__v >= numeric_limits<unsigned>::max() / 10)
          __throw_regex_error<regex_constants::error_backref>();
        __v = 10 * __v + *__first - '0';
      }
      if (__v == 0 || __v > mark_count())
        __throw_regex_error<regex_constants::error_backref>();
      __push_back_ref(__v);
    }
  }
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator
basic_regex<_CharT, _Traits>::__parse_character_class_escape(_ForwardIterator __first, _ForwardIterator __last) {
  if (__first != __last) {
    __bracket_expression<_CharT, _Traits>* __ml;
    switch (*__first) {
    case 'd':
      __ml = __start_matching_list(false);
      __ml->__add_class(ctype_base::digit);
      ++__first;
      break;
    case 'D':
      __ml = __start_matching_list(true);
      __ml->__add_class(ctype_base::digit);
      ++__first;
      break;
    case 's':
      __ml = __start_matching_list(false);
      __ml->__add_class(ctype_base::space);
      ++__first;
      break;
    case 'S':
      __ml = __start_matching_list(true);
      __ml->__add_class(ctype_base::space);
      ++__first;
      break;
    case 'w':
      __ml = __start_matching_list(false);
      __ml->__add_class(ctype_base::alnum);
      __ml->__add_char('_');
      ++__first;
      break;
    case 'W':
      __ml = __start_matching_list(true);
      __ml->__add_class(ctype_base::alnum);
      __ml->__add_char('_');
      ++__first;
      break;
    }
  }
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator basic_regex<_CharT, _Traits>::__parse_character_escape(
    _ForwardIterator __first, _ForwardIterator __last, basic_string<_CharT>* __str) {
  if (__first != __last) {
    _ForwardIterator __t;
    unsigned __sum = 0;
    int __hd;
    switch (*__first) {
    case 'f':
      if (__str)
        *__str = _CharT(0xC);
      else
        __push_char(_CharT(0xC));
      ++__first;
      break;
    case 'n':
      if (__str)
        *__str = _CharT(0xA);
      else
        __push_char(_CharT(0xA));
      ++__first;
      break;
    case 'r':
      if (__str)
        *__str = _CharT(0xD);
      else
        __push_char(_CharT(0xD));
      ++__first;
      break;
    case 't':
      if (__str)
        *__str = _CharT(0x9);
      else
        __push_char(_CharT(0x9));
      ++__first;
      break;
    case 'v':
      if (__str)
        *__str = _CharT(0xB);
      else
        __push_char(_CharT(0xB));
      ++__first;
      break;
    case 'c':
      if ((__t = std::next(__first)) != __last) {
        if (('A' <= *__t && *__t <= 'Z') || ('a' <= *__t && *__t <= 'z')) {
          if (__str)
            *__str = _CharT(*__t % 32);
          else
            __push_char(_CharT(*__t % 32));
          __first = ++__t;
        } else
          __throw_regex_error<regex_constants::error_escape>();
      } else
        __throw_regex_error<regex_constants::error_escape>();
      break;
    case 'u':
      ++__first;
      if (__first == __last)
        __throw_regex_error<regex_constants::error_escape>();
      __hd = __traits_.value(*__first, 16);
      if (__hd == -1)
        __throw_regex_error<regex_constants::error_escape>();
      __sum = 16 * __sum + static_cast<unsigned>(__hd);
      ++__first;
      if (__first == __last)
        __throw_regex_error<regex_constants::error_escape>();
      __hd = __traits_.value(*__first, 16);
      if (__hd == -1)
        __throw_regex_error<regex_constants::error_escape>();
      __sum = 16 * __sum + static_cast<unsigned>(__hd);
      _LIBCPP_FALLTHROUGH();
    case 'x':
      ++__first;
      if (__first == __last)
        __throw_regex_error<regex_constants::error_escape>();
      __hd = __traits_.value(*__first, 16);
      if (__hd == -1)
        __throw_regex_error<regex_constants::error_escape>();
      __sum = 16 * __sum + static_cast<unsigned>(__hd);
      ++__first;
      if (__first == __last)
        __throw_regex_error<regex_constants::error_escape>();
      __hd = __traits_.value(*__first, 16);
      if (__hd == -1)
        __throw_regex_error<regex_constants::error_escape>();
      __sum = 16 * __sum + static_cast<unsigned>(__hd);
      if (__str)
        *__str = _CharT(__sum);
      else
        __push_char(_CharT(__sum));
      ++__first;
      break;
    case '0':
      if (__str)
        *__str = _CharT(0);
      else
        __push_char(_CharT(0));
      ++__first;
      break;
    default:
      if (*__first != '_' && !__traits_.isctype(*__first, ctype_base::alnum)) {
        if (__str)
          *__str = *__first;
        else
          __push_char(*__first);
        ++__first;
      } else
        __throw_regex_error<regex_constants::error_escape>();
      break;
    }
  }
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator
basic_regex<_CharT, _Traits>::__parse_pattern_character(_ForwardIterator __first, _ForwardIterator __last) {
  if (__first != __last) {
    switch (*__first) {
    case '^':
    case '$':
    case '\\':
    case '.':
    case '*':
    case '+':
    case '?':
    case '(':
    case ')':
    case '[':
    case ']':
    case '{':
    case '}':
    case '|':
      break;
    default:
      __push_char(*__first);
      ++__first;
      break;
    }
  }
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator basic_regex<_CharT, _Traits>::__parse_grep(_ForwardIterator __first, _ForwardIterator __last) {
  __owns_one_state<_CharT>* __sa = __end_;
  _ForwardIterator __t1          = std::find(__first, __last, _CharT('\n'));
  if (__t1 != __first)
    __parse_basic_reg_exp(__first, __t1);
  else
    __push_empty();
  __first = __t1;
  if (__first != __last)
    ++__first;
  while (__first != __last) {
    __t1                           = std::find(__first, __last, _CharT('\n'));
    __owns_one_state<_CharT>* __sb = __end_;
    if (__t1 != __first)
      __parse_basic_reg_exp(__first, __t1);
    else
      __push_empty();
    __push_alternation(__sa, __sb);
    __first = __t1;
    if (__first != __last)
      ++__first;
  }
  return __first;
}

template <class _CharT, class _Traits>
template <class _ForwardIterator>
_ForwardIterator basic_regex<_CharT, _Traits>::__parse_egrep(_ForwardIterator __first, _ForwardIterator __last) {
  __owns_one_state<_CharT>* __sa = __end_;
  _ForwardIterator __t1          = std::find(__first, __last, _CharT('\n'));
  if (__t1 != __first)
    __parse_extended_reg_exp(__first, __t1);
  else
    __push_empty();
  __first = __t1;
  if (__first != __last)
    ++__first;
  while (__first != __last) {
    __t1                           = std::find(__first, __last, _CharT('\n'));
    __owns_one_state<_CharT>* __sb = __end_;
    if (__t1 != __first)
      __parse_extended_reg_exp(__first, __t1);
    else
      __push_empty();
    __push_alternation(__sa, __sb);
    __first = __t1;
    if (__first != __last)
      ++__first;
  }
  return __first;
}

template <class _CharT, class _Traits>
bool basic_regex<_CharT, _Traits>::__test_back_ref(_CharT __c) {
  unsigned __val = __traits_.value(__c, 10);
  if (__val >= 1 && __val <= 9) {
    if (__val > mark_count())
      __throw_regex_error<regex_constants::error_backref>();
    __push_back_ref(__val);
    return true;
  }

  return false;
}

template <class _CharT, class _Traits>
void basic_regex<_CharT, _Traits>::__push_loop(
    size_t __min, size_t __max, __owns_one_state<_CharT>* __s, size_t __mexp_begin, size_t __mexp_end, bool __greedy) {
  unique_ptr<__empty_state<_CharT> > __e1(new __empty_state<_CharT>(__end_->first()));
  __end_->first() = nullptr;
  unique_ptr<__loop<_CharT> > __e2(
      new __loop<_CharT>(__loop_count_, __s->first(), __e1.get(), __mexp_begin, __mexp_end, __greedy, __min, __max));
  __s->first() = nullptr;
  __e1.release();
  __end_->first() = new __repeat_one_loop<_CharT>(__e2.get());
  __end_          = __e2->second();
  __s->first()    = __e2.release();
  ++__loop_count_;
}

template <class _CharT, class _Traits>
void basic_regex<_CharT, _Traits>::__push_char(value_type __c) {
  if (flags() & icase)
    __end_->first() = new __match_char_icase<_CharT, _Traits>(__traits_, __c, __end_->first());
  else if (flags() & collate)
    __end_->first() = new __match_char_collate<_CharT, _Traits>(__traits_, __c, __end_->first());
  else
    __end_->first() = new __match_char<_CharT>(__c, __end_->first());
  __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
}

template <class _CharT, class _Traits>
void basic_regex<_CharT, _Traits>::__push_begin_marked_subexpression() {
  if (!(__flags_ & nosubs)) {
    __end_->first() = new __begin_marked_subexpression<_CharT>(++__marked_count_, __end_->first());
    __end_          = static_cast<__owns_one_state<_CharT>*>(__end_->first());
  }
}

template <class _CharT, class _Traits>
void basic_regex<_CharT, _Traits>::__push_end_marked_subexpression(unsigned __sub) {
  if (!(__flags_ & nosubs)) {
    __end_->first() = new __end_marked_subexpression<_CharT>(__sub, __end_->first());
    __end_          = static_cast<__owns_one_state<_CharT>*>(__end_->first());
  }
}

template <class _CharT, class _Traits>
void basic_regex<_CharT, _Traits>::__push_l_anchor() {
  __end_->first() = new __l_anchor_multiline<_CharT>(__use_multiline(), __end_->first());
  __end_          = static_cast<__owns_one_state<_CharT>*>(__end_->first());
}

template <class _CharT, class _Traits>
void basic_regex<_CharT, _Traits>::__push_r_anchor() {
  __end_->first() = new __r_anchor_multiline<_CharT>(__use_multiline(), __end_->first());
  __end_          = static_cast<__owns_one_state<_CharT>*>(__end_->first());
}

template <class _CharT, class _Traits>
void basic_regex<_CharT, _Traits>::__push_match_any() {
  __end_->first() = new __match_any<_CharT>(__end_->first());
  __end_          = static_cast<__owns_one_state<_CharT>*>(__end_->first());
}

template <class _CharT, class _Traits>
void basic_regex<_CharT, _Traits>::__push_match_any_but_newline() {
  __end_->first() = new __match_any_but_newline<_CharT>(__end_->first());
  __end_          = static_cast<__owns_one_state<_CharT>*>(__end_->first());
}

template <class _CharT, class _Traits>
void basic_regex<_CharT, _Traits>::__push_empty() {
  __end_->first() = new __empty_state<_CharT>(__end_->first());
  __end_          = static_cast<__owns_one_state<_CharT>*>(__end_->first());
}

template <class _CharT, class _Traits>
void basic_regex<_CharT, _Traits>::__push_word_boundary(bool __invert) {
  __end_->first() = new __word_boundary<_CharT, _Traits>(__traits_, __invert, __end_->first());
  __end_          = static_cast<__owns_one_state<_CharT>*>(__end_->first());
}

template <class _CharT, class _Traits>
void basic_regex<_CharT, _Traits>::__push_back_ref(int __i) {
  if (flags() & icase)
    __end_->first() = new __back_ref_icase<_CharT, _Traits>(__traits_, __i, __end_->first());
  else if (flags() & collate)
    __end_->first() = new __back_ref_collate<_CharT, _Traits>(__traits_, __i, __end_->first());
  else
    __end_->first() = new __back_ref<_CharT>(__i, __end_->first());
  __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
}

template <class _CharT, class _Traits>
void basic_regex<_CharT, _Traits>::__push_alternation(__owns_one_state<_CharT>* __sa, __owns_one_state<_CharT>* __ea) {
  __sa->first() = new __alternate<_CharT>(
      static_cast<__owns_one_state<_CharT>*>(__sa->first()), static_cast<__owns_one_state<_CharT>*>(__ea->first()));
  __ea->first()   = nullptr;
  __ea->first()   = new __empty_state<_CharT>(__end_->first());
  __end_->first() = nullptr;
  __end_->first() = new __empty_non_own_state<_CharT>(__ea->first());
  __end_          = static_cast<__owns_one_state<_CharT>*>(__ea->first());
}

template <class _CharT, class _Traits>
__bracket_expression<_CharT, _Traits>* basic_regex<_CharT, _Traits>::__start_matching_list(bool __negate) {
  __bracket_expression<_CharT, _Traits>* __r = new __bracket_expression<_CharT, _Traits>(
      __traits_, __end_->first(), __negate, __flags_ & icase, __flags_ & collate);
  __end_->first() = __r;
  __end_          = __r;
  return __r;
}

template <class _CharT, class _Traits>
void basic_regex<_CharT, _Traits>::__push_lookahead(const basic_regex& __exp, bool __invert, unsigned __mexp) {
  __end_->first() = new __lookahead<_CharT, _Traits>(__exp, __invert, __end_->first(), __mexp);
  __end_          = static_cast<__owns_one_state<_CharT>*>(__end_->first());
}

// sub_match

typedef sub_match<const char*> csub_match;
typedef sub_match<string::const_iterator> ssub_match;
#if _LIBCPP_HAS_WIDE_CHARACTERS
typedef sub_match<const wchar_t*> wcsub_match;
typedef sub_match<wstring::const_iterator> wssub_match;
#endif

template <class _BidirectionalIterator>
class _LIBCPP_TEMPLATE_VIS _LIBCPP_PREFERRED_NAME(csub_match)
    _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wcsub_match)) _LIBCPP_PREFERRED_NAME(ssub_match)
        _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wssub_match)) sub_match
    : public pair<_BidirectionalIterator, _BidirectionalIterator> {
public:
  typedef _BidirectionalIterator iterator;
  typedef typename iterator_traits<iterator>::value_type value_type;
  typedef typename iterator_traits<iterator>::difference_type difference_type;
  typedef basic_string<value_type> string_type;

  bool matched;

  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR sub_match() : matched() {}

  _LIBCPP_HIDE_FROM_ABI difference_type length() const {
    return matched ? std::distance(this->first, this->second) : 0;
  }
  _LIBCPP_HIDE_FROM_ABI string_type str() const {
    return matched ? string_type(this->first, this->second) : string_type();
  }
  _LIBCPP_HIDE_FROM_ABI operator string_type() const { return str(); }

  _LIBCPP_HIDE_FROM_ABI int compare(const sub_match& __s) const { return str().compare(__s.str()); }
  _LIBCPP_HIDE_FROM_ABI int compare(const string_type& __s) const { return str().compare(__s); }
  _LIBCPP_HIDE_FROM_ABI int compare(const value_type* __s) const { return str().compare(__s); }

  _LIBCPP_HIDE_FROM_ABI void swap(sub_match& __s) _NOEXCEPT_(__is_nothrow_swappable_v<_BidirectionalIterator>) {
    this->pair<_BidirectionalIterator, _BidirectionalIterator>::swap(__s);
    std::swap(matched, __s.matched);
  }
};

template <class _BiIter>
inline _LIBCPP_HIDE_FROM_ABI bool operator==(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y) {
  return __x.compare(__y) == 0;
}

#if _LIBCPP_STD_VER >= 20
template <class _BiIter>
using __sub_match_cat = compare_three_way_result_t<basic_string<typename iterator_traits<_BiIter>::value_type>>;

template <class _BiIter>
_LIBCPP_HIDE_FROM_ABI auto operator<=>(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y) {
  return static_cast<__sub_match_cat<_BiIter>>(__x.compare(__y) <=> 0);
}
#else  // _LIBCPP_STD_VER >= 20
template <class _BiIter>
inline _LIBCPP_HIDE_FROM_ABI bool operator!=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y) {
  return !(__x == __y);
}

template <class _BiIter>
inline _LIBCPP_HIDE_FROM_ABI bool operator<(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y) {
  return __x.compare(__y) < 0;
}

template <class _BiIter>
inline _LIBCPP_HIDE_FROM_ABI bool operator<=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y) {
  return !(__y < __x);
}

template <class _BiIter>
inline _LIBCPP_HIDE_FROM_ABI bool operator>=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y) {
  return !(__x < __y);
}

template <class _BiIter>
inline _LIBCPP_HIDE_FROM_ABI bool operator>(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y) {
  return __y < __x;
}

template <class _BiIter, class _ST, class _SA>
inline _LIBCPP_HIDE_FROM_ABI bool
operator==(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
           const sub_match<_BiIter>& __y) {
  return __y.compare(typename sub_match<_BiIter>::string_type(__x.data(), __x.size())) == 0;
}

template <class _BiIter, class _ST, class _SA>
inline _LIBCPP_HIDE_FROM_ABI bool
operator!=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
           const sub_match<_BiIter>& __y) {
  return !(__x == __y);
}

template <class _BiIter, class _ST, class _SA>
inline _LIBCPP_HIDE_FROM_ABI bool
operator<(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
          const sub_match<_BiIter>& __y) {
  return __y.compare(typename sub_match<_BiIter>::string_type(__x.data(), __x.size())) > 0;
}

template <class _BiIter, class _ST, class _SA>
inline _LIBCPP_HIDE_FROM_ABI bool
operator>(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
          const sub_match<_BiIter>& __y) {
  return __y < __x;
}

template <class _BiIter, class _ST, class _SA>
inline _LIBCPP_HIDE_FROM_ABI bool
operator>=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
           const sub_match<_BiIter>& __y) {
  return !(__x < __y);
}

template <class _BiIter, class _ST, class _SA>
inline _LIBCPP_HIDE_FROM_ABI bool
operator<=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
           const sub_match<_BiIter>& __y) {
  return !(__y < __x);
}
#endif // _LIBCPP_STD_VER >= 20

template <class _BiIter, class _ST, class _SA>
inline _LIBCPP_HIDE_FROM_ABI bool
operator==(const sub_match<_BiIter>& __x,
           const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y) {
  return __x.compare(typename sub_match<_BiIter>::string_type(__y.data(), __y.size())) == 0;
}

#if _LIBCPP_STD_VER >= 20
template <class _BiIter, class _ST, class _SA>
_LIBCPP_HIDE_FROM_ABI auto
operator<=>(const sub_match<_BiIter>& __x,
            const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y) {
  return static_cast<__sub_match_cat<_BiIter>>(
      __x.compare(typename sub_match<_BiIter>::string_type(__y.data(), __y.size())) <=> 0);
}
#else  // _LIBCPP_STD_VER >= 20
template <class _BiIter, class _ST, class _SA>
inline _LIBCPP_HIDE_FROM_ABI bool
operator!=(const sub_match<_BiIter>& __x,
           const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y) {
  return !(__x == __y);
}

template <class _BiIter, class _ST, class _SA>
inline _LIBCPP_HIDE_FROM_ABI bool
operator<(const sub_match<_BiIter>& __x,
          const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y) {
  return __x.compare(typename sub_match<_BiIter>::string_type(__y.data(), __y.size())) < 0;
}

template <class _BiIter, class _ST, class _SA>
inline _LIBCPP_HIDE_FROM_ABI bool
operator>(const sub_match<_BiIter>& __x,
          const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y) {
  return __y < __x;
}

template <class _BiIter, class _ST, class _SA>
inline _LIBCPP_HIDE_FROM_ABI bool
operator>=(const sub_match<_BiIter>& __x,
           const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y) {
  return !(__x < __y);
}

template <class _BiIter, class _ST, class _SA>
inline _LIBCPP_HIDE_FROM_ABI bool
operator<=(const sub_match<_BiIter>& __x,
           const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y) {
  return !(__y < __x);
}

template <class _BiIter>
inline _LIBCPP_HIDE_FROM_ABI bool
operator==(typename iterator_traits<_BiIter>::value_type const* __x, const sub_match<_BiIter>& __y) {
  return __y.compare(__x) == 0;
}

template <class _BiIter>
inline _LIBCPP_HIDE_FROM_ABI bool
operator!=(typename iterator_traits<_BiIter>::value_type const* __x, const sub_match<_BiIter>& __y) {
  return !(__x == __y);
}

template <class _BiIter>
inline _LIBCPP_HIDE_FROM_ABI bool
operator<(typename iterator_traits<_BiIter>::value_type const* __x, const sub_match<_BiIter>& __y) {
  return __y.compare(__x) > 0;
}

template <class _BiIter>
inline _LIBCPP_HIDE_FROM_ABI bool
operator>(typename iterator_traits<_BiIter>::value_type const* __x, const sub_match<_BiIter>& __y) {
  return __y < __x;
}

template <class _BiIter>
inline _LIBCPP_HIDE_FROM_ABI bool
operator>=(typename iterator_traits<_BiIter>::value_type const* __x, const sub_match<_BiIter>& __y) {
  return !(__x < __y);
}

template <class _BiIter>
inline _LIBCPP_HIDE_FROM_ABI bool
operator<=(typename iterator_traits<_BiIter>::value_type const* __x, const sub_match<_BiIter>& __y) {
  return !(__y < __x);
}
#endif // _LIBCPP_STD_VER >= 20

template <class _BiIter>
inline _LIBCPP_HIDE_FROM_ABI bool
operator==(const sub_match<_BiIter>& __x, typename iterator_traits<_BiIter>::value_type const* __y) {
  return __x.compare(__y) == 0;
}

#if _LIBCPP_STD_VER >= 20
template <class _BiIter>
_LIBCPP_HIDE_FROM_ABI auto
operator<=>(const sub_match<_BiIter>& __x, typename iterator_traits<_BiIter>::value_type const* __y) {
  return static_cast<__sub_match_cat<_BiIter>>(__x.compare(__y) <=> 0);
}
#else  // _LIBCPP_STD_VER >= 20
template <class _BiIter>
inline _LIBCPP_HIDE_FROM_ABI bool
operator!=(const sub_match<_BiIter>& __x, typename iterator_traits<_BiIter>::value_type const* __y) {
  return !(__x == __y);
}

template <class _BiIter>
inline _LIBCPP_HIDE_FROM_ABI bool
operator<(const sub_match<_BiIter>& __x, typename iterator_traits<_BiIter>::value_type const* __y) {
  return __x.compare(__y) < 0;
}

template <class _BiIter>
inline _LIBCPP_HIDE_FROM_ABI bool
operator>(const sub_match<_BiIter>& __x, typename iterator_traits<_BiIter>::value_type const* __y) {
  return __y < __x;
}

template <class _BiIter>
inline _LIBCPP_HIDE_FROM_ABI bool
operator>=(const sub_match<_BiIter>& __x, typename iterator_traits<_BiIter>::value_type const* __y) {
  return !(__x < __y);
}

template <class _BiIter>
inline _LIBCPP_HIDE_FROM_ABI bool
operator<=(const sub_match<_BiIter>& __x, typename iterator_traits<_BiIter>::value_type const* __y) {
  return !(__y < __x);
}

template <class _BiIter>
inline _LIBCPP_HIDE_FROM_ABI bool
operator==(typename iterator_traits<_BiIter>::value_type const& __x, const sub_match<_BiIter>& __y) {
  typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
  return __y.compare(string_type(1, __x)) == 0;
}

template <class _BiIter>
inline _LIBCPP_HIDE_FROM_ABI bool
operator!=(typename iterator_traits<_BiIter>::value_type const& __x, const sub_match<_BiIter>& __y) {
  return !(__x == __y);
}

template <class _BiIter>
inline _LIBCPP_HIDE_FROM_ABI bool
operator<(typename iterator_traits<_BiIter>::value_type const& __x, const sub_match<_BiIter>& __y) {
  typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
  return __y.compare(string_type(1, __x)) > 0;
}

template <class _BiIter>
inline _LIBCPP_HIDE_FROM_ABI bool
operator>(typename iterator_traits<_BiIter>::value_type const& __x, const sub_match<_BiIter>& __y) {
  return __y < __x;
}

template <class _BiIter>
inline _LIBCPP_HIDE_FROM_ABI bool
operator>=(typename iterator_traits<_BiIter>::value_type const& __x, const sub_match<_BiIter>& __y) {
  return !(__x < __y);
}

template <class _BiIter>
inline _LIBCPP_HIDE_FROM_ABI bool
operator<=(typename iterator_traits<_BiIter>::value_type const& __x, const sub_match<_BiIter>& __y) {
  return !(__y < __x);
}
#endif // _LIBCPP_STD_VER >= 20

template <class _BiIter>
inline _LIBCPP_HIDE_FROM_ABI bool
operator==(const sub_match<_BiIter>& __x, typename iterator_traits<_BiIter>::value_type const& __y) {
  typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
  return __x.compare(string_type(1, __y)) == 0;
}

#if _LIBCPP_STD_VER >= 20
template <class _BiIter>
_LIBCPP_HIDE_FROM_ABI auto
operator<=>(const sub_match<_BiIter>& __x, typename iterator_traits<_BiIter>::value_type const& __y) {
  using string_type = basic_string<typename iterator_traits<_BiIter>::value_type>;
  return static_cast<__sub_match_cat<_BiIter>>(__x.compare(string_type(1, __y)) <=> 0);
}
#else  // _LIBCPP_STD_VER >= 20
template <class _BiIter>
inline _LIBCPP_HIDE_FROM_ABI bool
operator!=(const sub_match<_BiIter>& __x, typename iterator_traits<_BiIter>::value_type const& __y) {
  return !(__x == __y);
}

template <class _BiIter>
inline _LIBCPP_HIDE_FROM_ABI bool
operator<(const sub_match<_BiIter>& __x, typename iterator_traits<_BiIter>::value_type const& __y) {
  typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
  return __x.compare(string_type(1, __y)) < 0;
}

template <class _BiIter>
inline _LIBCPP_HIDE_FROM_ABI bool
operator>(const sub_match<_BiIter>& __x, typename iterator_traits<_BiIter>::value_type const& __y) {
  return __y < __x;
}

template <class _BiIter>
inline _LIBCPP_HIDE_FROM_ABI bool
operator>=(const sub_match<_BiIter>& __x, typename iterator_traits<_BiIter>::value_type const& __y) {
  return !(__x < __y);
}

template <class _BiIter>
inline _LIBCPP_HIDE_FROM_ABI bool
operator<=(const sub_match<_BiIter>& __x, typename iterator_traits<_BiIter>::value_type const& __y) {
  return !(__y < __x);
}
#endif // _LIBCPP_STD_VER >= 20

template <class _CharT, class _ST, class _BiIter>
inline _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _ST>&
operator<<(basic_ostream<_CharT, _ST>& __os, const sub_match<_BiIter>& __m) {
  return __os << __m.str();
}

typedef match_results<const char*> cmatch;
typedef match_results<string::const_iterator> smatch;
#if _LIBCPP_HAS_WIDE_CHARACTERS
typedef match_results<const wchar_t*> wcmatch;
typedef match_results<wstring::const_iterator> wsmatch;
#endif

template <class _BidirectionalIterator, class _Allocator>
class _LIBCPP_TEMPLATE_VIS _LIBCPP_PREFERRED_NAME(cmatch) _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wcmatch))
    _LIBCPP_PREFERRED_NAME(smatch) _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wsmatch)) match_results {
public:
  typedef _Allocator allocator_type;
  typedef sub_match<_BidirectionalIterator> value_type;

private:
  typedef vector<value_type, allocator_type> __container_type;

  __container_type __matches_;
  value_type __unmatched_;
  value_type __prefix_;
  value_type __suffix_;
  bool __ready_;

public:
  _BidirectionalIterator __position_start_;
  typedef const value_type& const_reference;
  typedef value_type& reference;
  typedef typename __container_type::const_iterator const_iterator;
  typedef const_iterator iterator;
  typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
  typedef typename allocator_traits<allocator_type>::size_type size_type;
  typedef typename iterator_traits<_BidirectionalIterator>::value_type char_type;
  typedef basic_string<char_type> string_type;

  // construct/copy/destroy:
#ifndef _LIBCPP_CXX03_LANG
  match_results() : match_results(allocator_type()) {}
  explicit match_results(const allocator_type& __a);
#else
  explicit match_results(const allocator_type& __a = allocator_type());
#endif

  //    match_results(const match_results&) = default;
  //    match_results& operator=(const match_results&) = default;
  //    match_results(match_results&& __m) = default;
  //    match_results& operator=(match_results&& __m) = default;
  //    ~match_results() = default;

  _LIBCPP_HIDE_FROM_ABI bool ready() const { return __ready_; }

  // size:
  _LIBCPP_HIDE_FROM_ABI size_type size() const _NOEXCEPT { return __matches_.size(); }
  _LIBCPP_HIDE_FROM_ABI size_type max_size() const _NOEXCEPT { return __matches_.max_size(); }
  [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI bool empty() const _NOEXCEPT { return size() == 0; }

  // element access:
  _LIBCPP_HIDE_FROM_ABI difference_type length(size_type __sub = 0) const {
    // If the match results are not ready, this will return `0`.
    _LIBCPP_ASSERT_PEDANTIC(ready(), "match_results::length() called when not ready");
    return (*this)[__sub].length();
  }
  _LIBCPP_HIDE_FROM_ABI difference_type position(size_type __sub = 0) const {
    // If the match results are not ready, this will return the result of subtracting two default-constructed iterators
    // (which is typically a well-defined operation).
    _LIBCPP_ASSERT_PEDANTIC(ready(), "match_results::position() called when not ready");
    return std::distance(__position_start_, (*this)[__sub].first);
  }
  _LIBCPP_HIDE_FROM_ABI string_type str(size_type __sub = 0) const {
    // If the match results are not ready, this will return an empty string.
    _LIBCPP_ASSERT_PEDANTIC(ready(), "match_results::str() called when not ready");
    return (*this)[__sub].str();
  }
  _LIBCPP_HIDE_FROM_ABI const_reference operator[](size_type __n) const {
    // If the match results are not ready, this call will be equivalent to calling this function with `__n >= size()`,
    // returning an empty subrange.
    _LIBCPP_ASSERT_PEDANTIC(ready(), "match_results::operator[]() called when not ready");
    return __n < __matches_.size() ? __matches_[__n] : __unmatched_;
  }

  _LIBCPP_HIDE_FROM_ABI const_reference prefix() const {
    // If the match results are not ready, this will return a default-constructed empty `__suffix_`.
    _LIBCPP_ASSERT_PEDANTIC(ready(), "match_results::prefix() called when not ready");
    return __prefix_;
  }
  _LIBCPP_HIDE_FROM_ABI const_reference suffix() const {
    // If the match results are not ready, this will return a default-constructed empty `__suffix_`.
    _LIBCPP_ASSERT_PEDANTIC(ready(), "match_results::suffix() called when not ready");
    return __suffix_;
  }

  _LIBCPP_HIDE_FROM_ABI const_iterator begin() const { return empty() ? __matches_.end() : __matches_.begin(); }
  _LIBCPP_HIDE_FROM_ABI const_iterator end() const { return __matches_.end(); }
  _LIBCPP_HIDE_FROM_ABI const_iterator cbegin() const { return empty() ? __matches_.end() : __matches_.begin(); }
  _LIBCPP_HIDE_FROM_ABI const_iterator cend() const { return __matches_.end(); }

  // format:
  template <class _OutputIter>
  _OutputIter format(_OutputIter __output_iter,
                     const char_type* __fmt_first,
                     const char_type* __fmt_last,
                     regex_constants::match_flag_type __flags = regex_constants::format_default) const;
  template <class _OutputIter, class _ST, class _SA>
  _LIBCPP_HIDE_FROM_ABI _OutputIter
  format(_OutputIter __output_iter,
         const basic_string<char_type, _ST, _SA>& __fmt,
         regex_constants::match_flag_type __flags = regex_constants::format_default) const {
    return format(__output_iter, __fmt.data(), __fmt.data() + __fmt.size(), __flags);
  }
  template <class _ST, class _SA>
  _LIBCPP_HIDE_FROM_ABI basic_string<char_type, _ST, _SA>
  format(const basic_string<char_type, _ST, _SA>& __fmt,
         regex_constants::match_flag_type __flags = regex_constants::format_default) const {
    basic_string<char_type, _ST, _SA> __r;
    format(std::back_inserter(__r), __fmt.data(), __fmt.data() + __fmt.size(), __flags);
    return __r;
  }
  _LIBCPP_HIDE_FROM_ABI string_type
  format(const char_type* __fmt, regex_constants::match_flag_type __flags = regex_constants::format_default) const {
    string_type __r;
    format(std::back_inserter(__r), __fmt, __fmt + char_traits<char_type>::length(__fmt), __flags);
    return __r;
  }

  // allocator:
  _LIBCPP_HIDE_FROM_ABI allocator_type get_allocator() const { return __matches_.get_allocator(); }

  // swap:
  void swap(match_results& __m);

  template <class _Bp, class _Ap>
  _LIBCPP_HIDE_FROM_ABI void
  __assign(_BidirectionalIterator __f,
           _BidirectionalIterator __l,
           const match_results<_Bp, _Ap>& __m,
           bool __no_update_pos) {
    _Bp __mf = __m.prefix().first;
    __matches_.resize(__m.size());
    for (size_type __i = 0; __i < __matches_.size(); ++__i) {
      __matches_[__i].first   = std::next(__f, std::distance(__mf, __m[__i].first));
      __matches_[__i].second  = std::next(__f, std::distance(__mf, __m[__i].second));
      __matches_[__i].matched = __m[__i].matched;
    }
    __unmatched_.first   = __l;
    __unmatched_.second  = __l;
    __unmatched_.matched = false;
    __prefix_.first      = std::next(__f, std::distance(__mf, __m.prefix().first));
    __prefix_.second     = std::next(__f, std::distance(__mf, __m.prefix().second));
    __prefix_.matched    = __m.prefix().matched;
    __suffix_.first      = std::next(__f, std::distance(__mf, __m.suffix().first));
    __suffix_.second     = std::next(__f, std::distance(__mf, __m.suffix().second));
    __suffix_.matched    = __m.suffix().matched;
    if (!__no_update_pos)
      __position_start_ = __prefix_.first;
    __ready_ = __m.ready();
  }

private:
  void __init(unsigned __s, _BidirectionalIterator __f, _BidirectionalIterator __l, bool __no_update_pos = false);

  template <class, class>
  friend class basic_regex;

  template <class _Bp, class _Ap, class _Cp, class _Tp>
  friend bool
  regex_match(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type);

  template <class _Bp, class _Ap>
  friend bool operator==(const match_results<_Bp, _Ap>&, const match_results<_Bp, _Ap>&);

  template <class, class>
  friend class __lookahead;

  template <class, class, class>
  friend class regex_iterator;
};

template <class _BidirectionalIterator, class _Allocator>
match_results<_BidirectionalIterator, _Allocator>::match_results(const allocator_type& __a)
    : __matches_(__a), __unmatched_(), __prefix_(), __suffix_(), __ready_(false), __position_start_() {}

template <class _BidirectionalIterator, class _Allocator>
void match_results<_BidirectionalIterator, _Allocator>::__init(
    unsigned __s, _BidirectionalIterator __f, _BidirectionalIterator __l, bool __no_update_pos) {
  __unmatched_.first   = __l;
  __unmatched_.second  = __l;
  __unmatched_.matched = false;
  __matches_.assign(__s, __unmatched_);
  __prefix_.first   = __f;
  __prefix_.second  = __f;
  __prefix_.matched = false;
  __suffix_         = __unmatched_;
  if (!__no_update_pos)
    __position_start_ = __prefix_.first;
  __ready_ = true;
}

template <class _BidirectionalIterator, class _Allocator>
template <class _OutputIter>
_OutputIter match_results<_BidirectionalIterator, _Allocator>::format(
    _OutputIter __output_iter,
    const char_type* __fmt_first,
    const char_type* __fmt_last,
    regex_constants::match_flag_type __flags) const {
  // Note: this duplicates a check in `vector::operator[]` but provides a better error message.
  _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(ready(), "match_results::format() called when not ready");
  if (__flags & regex_constants::format_sed) {
    for (; __fmt_first != __fmt_last; ++__fmt_first) {
      if (*__fmt_first == '&')
        __output_iter = std::copy(__matches_[0].first, __matches_[0].second, __output_iter);
      else if (*__fmt_first == '\\' && __fmt_first + 1 != __fmt_last) {
        ++__fmt_first;
        if ('0' <= *__fmt_first && *__fmt_first <= '9') {
          size_t __i    = *__fmt_first - '0';
          __output_iter = std::copy((*this)[__i].first, (*this)[__i].second, __output_iter);
        } else {
          *__output_iter = *__fmt_first;
          ++__output_iter;
        }
      } else {
        *__output_iter = *__fmt_first;
        ++__output_iter;
      }
    }
  } else {
    for (; __fmt_first != __fmt_last; ++__fmt_first) {
      if (*__fmt_first == '$' && __fmt_first + 1 != __fmt_last) {
        switch (__fmt_first[1]) {
        case '$':
          *__output_iter = *++__fmt_first;
          ++__output_iter;
          break;
        case '&':
          ++__fmt_first;
          __output_iter = std::copy(__matches_[0].first, __matches_[0].second, __output_iter);
          break;
        case '`':
          ++__fmt_first;
          __output_iter = std::copy(__prefix_.first, __prefix_.second, __output_iter);
          break;
        case '\'':
          ++__fmt_first;
          __output_iter = std::copy(__suffix_.first, __suffix_.second, __output_iter);
          break;
        default:
          if ('0' <= __fmt_first[1] && __fmt_first[1] <= '9') {
            ++__fmt_first;
            size_t __idx = *__fmt_first - '0';
            if (__fmt_first + 1 != __fmt_last && '0' <= __fmt_first[1] && __fmt_first[1] <= '9') {
              ++__fmt_first;
              if (__idx >= numeric_limits<size_t>::max() / 10)
                __throw_regex_error<regex_constants::error_escape>();
              __idx = 10 * __idx + *__fmt_first - '0';
            }
            __output_iter = std::copy((*this)[__idx].first, (*this)[__idx].second, __output_iter);
          } else {
            *__output_iter = *__fmt_first;
            ++__output_iter;
          }
          break;
        }
      } else {
        *__output_iter = *__fmt_first;
        ++__output_iter;
      }
    }
  }
  return __output_iter;
}

template <class _BidirectionalIterator, class _Allocator>
void match_results<_BidirectionalIterator, _Allocator>::swap(match_results& __m) {
  using std::swap;
  swap(__matches_, __m.__matches_);
  swap(__unmatched_, __m.__unmatched_);
  swap(__prefix_, __m.__prefix_);
  swap(__suffix_, __m.__suffix_);
  swap(__position_start_, __m.__position_start_);
  swap(__ready_, __m.__ready_);
}

template <class _BidirectionalIterator, class _Allocator>
_LIBCPP_HIDE_FROM_ABI bool operator==(const match_results<_BidirectionalIterator, _Allocator>& __x,
                                      const match_results<_BidirectionalIterator, _Allocator>& __y) {
  if (__x.__ready_ != __y.__ready_)
    return false;
  if (!__x.__ready_)
    return true;
  return __x.__matches_ == __y.__matches_ && __x.__prefix_ == __y.__prefix_ && __x.__suffix_ == __y.__suffix_;
}

#if _LIBCPP_STD_VER < 20
template <class _BidirectionalIterator, class _Allocator>
inline _LIBCPP_HIDE_FROM_ABI bool operator!=(const match_results<_BidirectionalIterator, _Allocator>& __x,
                                             const match_results<_BidirectionalIterator, _Allocator>& __y) {
  return !(__x == __y);
}
#endif

template <class _BidirectionalIterator, class _Allocator>
inline _LIBCPP_HIDE_FROM_ABI void
swap(match_results<_BidirectionalIterator, _Allocator>& __x, match_results<_BidirectionalIterator, _Allocator>& __y) {
  __x.swap(__y);
}

// regex_search

template <class _CharT, class _Traits>
template <class _Allocator>
bool basic_regex<_CharT, _Traits>::__match_at_start_ecma(
    const _CharT* __first,
    const _CharT* __last,
    match_results<const _CharT*, _Allocator>& __m,
    regex_constants::match_flag_type __flags,
    bool __at_first) const {
  vector<__state> __states;
  __node* __st = __start_.get();
  if (__st) {
    sub_match<const _CharT*> __unmatched;
    __unmatched.first   = __last;
    __unmatched.second  = __last;
    __unmatched.matched = false;

    __states.push_back(__state());
    __states.back().__do_      = 0;
    __states.back().__first_   = __first;
    __states.back().__current_ = __first;
    __states.back().__last_    = __last;
    __states.back().__sub_matches_.resize(mark_count(), __unmatched);
    __states.back().__loop_data_.resize(__loop_count());
    __states.back().__node_     = __st;
    __states.back().__flags_    = __flags;
    __states.back().__at_first_ = __at_first;
    int __counter               = 0;
    int __length                = __last - __first;
    do {
      ++__counter;
      if (__counter % _LIBCPP_REGEX_COMPLEXITY_FACTOR == 0 && __counter / _LIBCPP_REGEX_COMPLEXITY_FACTOR >= __length)
        __throw_regex_error<regex_constants::error_complexity>();
      __state& __s = __states.back();
      if (__s.__node_)
        __s.__node_->__exec(__s);
      switch (__s.__do_) {
      case __state::__end_state:
        if ((__flags & regex_constants::match_not_null) && __s.__current_ == __first) {
          __states.pop_back();
          break;
        }
        if ((__flags & regex_constants::__full_match) && __s.__current_ != __last) {
          __states.pop_back();
          break;
        }
        __m.__matches_[0].first   = __first;
        __m.__matches_[0].second  = std::next(__first, __s.__current_ - __first);
        __m.__matches_[0].matched = true;
        for (unsigned __i = 0; __i < __s.__sub_matches_.size(); ++__i)
          __m.__matches_[__i + 1] = __s.__sub_matches_[__i];
        return true;
      case __state::__accept_and_consume:
      case __state::__repeat:
      case __state::__accept_but_not_consume:
        break;
      case __state::__split: {
        __state __snext = __s;
        __s.__node_->__exec_split(true, __s);
        __snext.__node_->__exec_split(false, __snext);
        __states.push_back(std::move(__snext));
      } break;
      case __state::__reject:
        __states.pop_back();
        break;
      default:
        __throw_regex_error<regex_constants::__re_err_unknown>();
        break;
      }
    } while (!__states.empty());
  }
  return false;
}

template <class _CharT, class _Traits>
template <class _Allocator>
bool basic_regex<_CharT, _Traits>::__match_at_start_posix_nosubs(
    const _CharT* __first,
    const _CharT* __last,
    match_results<const _CharT*, _Allocator>& __m,
    regex_constants::match_flag_type __flags,
    bool __at_first) const {
  deque<__state> __states;
  ptrdiff_t __highest_j = 0;
  ptrdiff_t __np        = std::distance(__first, __last);
  __node* __st          = __start_.get();
  if (__st) {
    __states.push_back(__state());
    __states.back().__do_      = 0;
    __states.back().__first_   = __first;
    __states.back().__current_ = __first;
    __states.back().__last_    = __last;
    __states.back().__loop_data_.resize(__loop_count());
    __states.back().__node_     = __st;
    __states.back().__flags_    = __flags;
    __states.back().__at_first_ = __at_first;
    bool __matched              = false;
    int __counter               = 0;
    int __length                = __last - __first;
    do {
      ++__counter;
      if (__counter % _LIBCPP_REGEX_COMPLEXITY_FACTOR == 0 && __counter / _LIBCPP_REGEX_COMPLEXITY_FACTOR >= __length)
        __throw_regex_error<regex_constants::error_complexity>();
      __state& __s = __states.back();
      if (__s.__node_)
        __s.__node_->__exec(__s);
      switch (__s.__do_) {
      case __state::__end_state:
        if ((__flags & regex_constants::match_not_null) && __s.__current_ == __first) {
          __states.pop_back();
          break;
        }
        if ((__flags & regex_constants::__full_match) && __s.__current_ != __last) {
          __states.pop_back();
          break;
        }
        if (!__matched || __highest_j < __s.__current_ - __s.__first_)
          __highest_j = __s.__current_ - __s.__first_;
        __matched = true;
        if (__highest_j == __np)
          __states.clear();
        else
          __states.pop_back();
        break;
      case __state::__consume_input:
        break;
      case __state::__accept_and_consume:
        __states.push_front(std::move(__s));
        __states.pop_back();
        break;
      case __state::__repeat:
      case __state::__accept_but_not_consume:
        break;
      case __state::__split: {
        __state __snext = __s;
        __s.__node_->__exec_split(true, __s);
        __snext.__node_->__exec_split(false, __snext);
        __states.push_back(std::move(__snext));
      } break;
      case __state::__reject:
        __states.pop_back();
        break;
      default:
        __throw_regex_error<regex_constants::__re_err_unknown>();
        break;
      }
    } while (!__states.empty());
    if (__matched) {
      __m.__matches_[0].first   = __first;
      __m.__matches_[0].second  = std::next(__first, __highest_j);
      __m.__matches_[0].matched = true;
      return true;
    }
  }
  return false;
}

template <class _CharT, class _Traits>
template <class _Allocator>
bool basic_regex<_CharT, _Traits>::__match_at_start_posix_subs(
    const _CharT* __first,
    const _CharT* __last,
    match_results<const _CharT*, _Allocator>& __m,
    regex_constants::match_flag_type __flags,
    bool __at_first) const {
  vector<__state> __states;
  __state __best_state;
  ptrdiff_t __highest_j = 0;
  ptrdiff_t __np        = std::distance(__first, __last);
  __node* __st          = __start_.get();
  if (__st) {
    sub_match<const _CharT*> __unmatched;
    __unmatched.first   = __last;
    __unmatched.second  = __last;
    __unmatched.matched = false;

    __states.push_back(__state());
    __states.back().__do_      = 0;
    __states.back().__first_   = __first;
    __states.back().__current_ = __first;
    __states.back().__last_    = __last;
    __states.back().__sub_matches_.resize(mark_count(), __unmatched);
    __states.back().__loop_data_.resize(__loop_count());
    __states.back().__node_     = __st;
    __states.back().__flags_    = __flags;
    __states.back().__at_first_ = __at_first;
    bool __matched              = false;
    int __counter               = 0;
    int __length                = __last - __first;
    do {
      ++__counter;
      if (__counter % _LIBCPP_REGEX_COMPLEXITY_FACTOR == 0 && __counter / _LIBCPP_REGEX_COMPLEXITY_FACTOR >= __length)
        __throw_regex_error<regex_constants::error_complexity>();
      __state& __s = __states.back();
      if (__s.__node_)
        __s.__node_->__exec(__s);
      switch (__s.__do_) {
      case __state::__end_state:
        if ((__flags & regex_constants::match_not_null) && __s.__current_ == __first) {
          __states.pop_back();
          break;
        }
        if ((__flags & regex_constants::__full_match) && __s.__current_ != __last) {
          __states.pop_back();
          break;
        }
        if (!__matched || __highest_j < __s.__current_ - __s.__first_) {
          __highest_j  = __s.__current_ - __s.__first_;
          __best_state = __s;
        }
        __matched = true;
        if (__highest_j == __np)
          __states.clear();
        else
          __states.pop_back();
        break;
      case __state::__accept_and_consume:
      case __state::__repeat:
      case __state::__accept_but_not_consume:
        break;
      case __state::__split: {
        __state __snext = __s;
        __s.__node_->__exec_split(true, __s);
        __snext.__node_->__exec_split(false, __snext);
        __states.push_back(std::move(__snext));
      } break;
      case __state::__reject:
        __states.pop_back();
        break;
      default:
        __throw_regex_error<regex_constants::__re_err_unknown>();
        break;
      }
    } while (!__states.empty());
    if (__matched) {
      __m.__matches_[0].first   = __first;
      __m.__matches_[0].second  = std::next(__first, __highest_j);
      __m.__matches_[0].matched = true;
      for (unsigned __i = 0; __i < __best_state.__sub_matches_.size(); ++__i)
        __m.__matches_[__i + 1] = __best_state.__sub_matches_[__i];
      return true;
    }
  }
  return false;
}

template <class _CharT, class _Traits>
template <class _Allocator>
bool basic_regex<_CharT, _Traits>::__match_at_start(
    const _CharT* __first,
    const _CharT* __last,
    match_results<const _CharT*, _Allocator>& __m,
    regex_constants::match_flag_type __flags,
    bool __at_first) const {
  if (__get_grammar(__flags_) == ECMAScript)
    return __match_at_start_ecma(__first, __last, __m, __flags, __at_first);
  if (mark_count() == 0)
    return __match_at_start_posix_nosubs(__first, __last, __m, __flags, __at_first);
  return __match_at_start_posix_subs(__first, __last, __m, __flags, __at_first);
}

template <class _CharT, class _Traits>
template <class _Allocator>
bool basic_regex<_CharT, _Traits>::__search(
    const _CharT* __first,
    const _CharT* __last,
    match_results<const _CharT*, _Allocator>& __m,
    regex_constants::match_flag_type __flags) const {
  if (__flags & regex_constants::match_prev_avail)
    __flags &= ~(regex_constants::match_not_bol | regex_constants::match_not_bow);

  __m.__init(1 + mark_count(), __first, __last, __flags & regex_constants::__no_update_pos);
  if (__match_at_start(__first, __last, __m, __flags, !(__flags & regex_constants::__no_update_pos))) {
    __m.__prefix_.second  = __m[0].first;
    __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
    __m.__suffix_.first   = __m[0].second;
    __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
    return true;
  }
  if (__first != __last && !(__flags & regex_constants::match_continuous)) {
    __flags |= regex_constants::match_prev_avail;
    for (++__first; __first != __last; ++__first) {
      __m.__matches_.assign(__m.size(), __m.__unmatched_);
      if (__match_at_start(__first, __last, __m, __flags, false)) {
        __m.__prefix_.second  = __m[0].first;
        __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
        __m.__suffix_.first   = __m[0].second;
        __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
        return true;
      }
      __m.__matches_.assign(__m.size(), __m.__unmatched_);
    }
    __m.__matches_.assign(__m.size(), __m.__unmatched_);
    if (__match_at_start(__first, __last, __m, __flags, false)) {
      __m.__prefix_.second  = __m[0].first;
      __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
      __m.__suffix_.first   = __m[0].second;
      __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
      return true;
    }
  }
  __m.__matches_.clear();
  return false;
}

template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits>
inline _LIBCPP_HIDE_FROM_ABI bool
regex_search(_BidirectionalIterator __first,
             _BidirectionalIterator __last,
             match_results<_BidirectionalIterator, _Allocator>& __m,
             const basic_regex<_CharT, _Traits>& __e,
             regex_constants::match_flag_type __flags = regex_constants::match_default) {
  int __offset = (__flags & regex_constants::match_prev_avail) ? 1 : 0;
  basic_string<_CharT> __s(std::prev(__first, __offset), __last);
  match_results<const _CharT*> __mc;
  bool __r = __e.__search(__s.data() + __offset, __s.data() + __s.size(), __mc, __flags);
  __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
  return __r;
}

template <class _Iter, class _Allocator, class _CharT, class _Traits>
inline _LIBCPP_HIDE_FROM_ABI bool
regex_search(__wrap_iter<_Iter> __first,
             __wrap_iter<_Iter> __last,
             match_results<__wrap_iter<_Iter>, _Allocator>& __m,
             const basic_regex<_CharT, _Traits>& __e,
             regex_constants::match_flag_type __flags = regex_constants::match_default) {
  match_results<const _CharT*> __mc;
  bool __r = __e.__search(__first.base(), __last.base(), __mc, __flags);
  __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
  return __r;
}

template <class _Allocator, class _CharT, class _Traits>
inline _LIBCPP_HIDE_FROM_ABI bool
regex_search(const _CharT* __first,
             const _CharT* __last,
             match_results<const _CharT*, _Allocator>& __m,
             const basic_regex<_CharT, _Traits>& __e,
             regex_constants::match_flag_type __flags = regex_constants::match_default) {
  return __e.__search(__first, __last, __m, __flags);
}

template <class _BidirectionalIterator, class _CharT, class _Traits>
inline _LIBCPP_HIDE_FROM_ABI bool
regex_search(_BidirectionalIterator __first,
             _BidirectionalIterator __last,
             const basic_regex<_CharT, _Traits>& __e,
             regex_constants::match_flag_type __flags = regex_constants::match_default) {
  basic_string<_CharT> __s(__first, __last);
  match_results<const _CharT*> __mc;
  return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
}

template <class _CharT, class _Traits>
inline _LIBCPP_HIDE_FROM_ABI bool
regex_search(const _CharT* __first,
             const _CharT* __last,
             const basic_regex<_CharT, _Traits>& __e,
             regex_constants::match_flag_type __flags = regex_constants::match_default) {
  match_results<const _CharT*> __mc;
  return __e.__search(__first, __last, __mc, __flags);
}

template <class _CharT, class _Allocator, class _Traits>
inline _LIBCPP_HIDE_FROM_ABI bool
regex_search(const _CharT* __str,
             match_results<const _CharT*, _Allocator>& __m,
             const basic_regex<_CharT, _Traits>& __e,
             regex_constants::match_flag_type __flags = regex_constants::match_default) {
  return __e.__search(__str, __str + _Traits::length(__str), __m, __flags);
}

template <class _CharT, class _Traits>
inline _LIBCPP_HIDE_FROM_ABI bool
regex_search(const _CharT* __str,
             const basic_regex<_CharT, _Traits>& __e,
             regex_constants::match_flag_type __flags = regex_constants::match_default) {
  match_results<const _CharT*> __m;
  return std::regex_search(__str, __m, __e, __flags);
}

template <class _ST, class _SA, class _CharT, class _Traits>
inline _LIBCPP_HIDE_FROM_ABI bool
regex_search(const basic_string<_CharT, _ST, _SA>& __s,
             const basic_regex<_CharT, _Traits>& __e,
             regex_constants::match_flag_type __flags = regex_constants::match_default) {
  match_results<const _CharT*> __mc;
  return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
}

template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
inline _LIBCPP_HIDE_FROM_ABI bool
regex_search(const basic_string<_CharT, _ST, _SA>& __s,
             match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
             const basic_regex<_CharT, _Traits>& __e,
             regex_constants::match_flag_type __flags = regex_constants::match_default) {
  match_results<const _CharT*> __mc;
  bool __r = __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
  __m.__assign(__s.begin(), __s.end(), __mc, __flags & regex_constants::__no_update_pos);
  return __r;
}

#if _LIBCPP_STD_VER >= 14
template <class _ST, class _SA, class _Ap, class _Cp, class _Tp>
bool regex_search(const basic_string<_Cp, _ST, _SA>&& __s,
                  match_results<typename basic_string<_Cp, _ST, _SA>::const_iterator, _Ap>&,
                  const basic_regex<_Cp, _Tp>& __e,
                  regex_constants::match_flag_type __flags = regex_constants::match_default) = delete;
#endif

// regex_match

template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits>
_LIBCPP_HIDE_FROM_ABI bool
regex_match(_BidirectionalIterator __first,
            _BidirectionalIterator __last,
            match_results<_BidirectionalIterator, _Allocator>& __m,
            const basic_regex<_CharT, _Traits>& __e,
            regex_constants::match_flag_type __flags = regex_constants::match_default) {
  bool __r = std::regex_search(
      __first, __last, __m, __e, __flags | regex_constants::match_continuous | regex_constants::__full_match);
  if (__r) {
    __r = !__m.suffix().matched;
    if (!__r)
      __m.__matches_.clear();
  }
  return __r;
}

template <class _BidirectionalIterator, class _CharT, class _Traits>
inline _LIBCPP_HIDE_FROM_ABI bool
regex_match(_BidirectionalIterator __first,
            _BidirectionalIterator __last,
            const basic_regex<_CharT, _Traits>& __e,
            regex_constants::match_flag_type __flags = regex_constants::match_default) {
  match_results<_BidirectionalIterator> __m;
  return std::regex_match(__first, __last, __m, __e, __flags);
}

template <class _CharT, class _Allocator, class _Traits>
inline _LIBCPP_HIDE_FROM_ABI bool
regex_match(const _CharT* __str,
            match_results<const _CharT*, _Allocator>& __m,
            const basic_regex<_CharT, _Traits>& __e,
            regex_constants::match_flag_type __flags = regex_constants::match_default) {
  return std::regex_match(__str, __str + _Traits::length(__str), __m, __e, __flags);
}

template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
inline _LIBCPP_HIDE_FROM_ABI bool
regex_match(const basic_string<_CharT, _ST, _SA>& __s,
            match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
            const basic_regex<_CharT, _Traits>& __e,
            regex_constants::match_flag_type __flags = regex_constants::match_default) {
  return std::regex_match(__s.begin(), __s.end(), __m, __e, __flags);
}

#if _LIBCPP_STD_VER >= 14
template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
inline _LIBCPP_HIDE_FROM_ABI bool
regex_match(const basic_string<_CharT, _ST, _SA>&& __s,
            match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
            const basic_regex<_CharT, _Traits>& __e,
            regex_constants::match_flag_type __flags = regex_constants::match_default) = delete;
#endif

template <class _CharT, class _Traits>
inline _LIBCPP_HIDE_FROM_ABI bool
regex_match(const _CharT* __str,
            const basic_regex<_CharT, _Traits>& __e,
            regex_constants::match_flag_type __flags = regex_constants::match_default) {
  return std::regex_match(__str, __str + _Traits::length(__str), __e, __flags);
}

template <class _ST, class _SA, class _CharT, class _Traits>
inline _LIBCPP_HIDE_FROM_ABI bool
regex_match(const basic_string<_CharT, _ST, _SA>& __s,
            const basic_regex<_CharT, _Traits>& __e,
            regex_constants::match_flag_type __flags = regex_constants::match_default) {
  return std::regex_match(__s.begin(), __s.end(), __e, __flags);
}

// regex_iterator

template <class _BidirectionalIterator,
          class _CharT  = typename iterator_traits<_BidirectionalIterator>::value_type,
          class _Traits = regex_traits<_CharT> >
class _LIBCPP_TEMPLATE_VIS regex_iterator;

typedef regex_iterator<const char*> cregex_iterator;
typedef regex_iterator<string::const_iterator> sregex_iterator;
#if _LIBCPP_HAS_WIDE_CHARACTERS
typedef regex_iterator<const wchar_t*> wcregex_iterator;
typedef regex_iterator<wstring::const_iterator> wsregex_iterator;
#endif

template <class _BidirectionalIterator, class _CharT, class _Traits>
class _LIBCPP_TEMPLATE_VIS _LIBCPP_PREFERRED_NAME(cregex_iterator)
    _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wcregex_iterator)) _LIBCPP_PREFERRED_NAME(sregex_iterator)
        _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wsregex_iterator)) regex_iterator {
public:
  typedef basic_regex<_CharT, _Traits> regex_type;
  typedef match_results<_BidirectionalIterator> value_type;
  typedef ptrdiff_t difference_type;
  typedef const value_type* pointer;
  typedef const value_type& reference;
  typedef forward_iterator_tag iterator_category;
#if _LIBCPP_STD_VER >= 20
  typedef input_iterator_tag iterator_concept;
#endif

private:
  _BidirectionalIterator __begin_;
  _BidirectionalIterator __end_;
  const regex_type* __pregex_;
  regex_constants::match_flag_type __flags_;
  value_type __match_;

public:
  regex_iterator();
  regex_iterator(_BidirectionalIterator __a,
                 _BidirectionalIterator __b,
                 const regex_type& __re,
                 regex_constants::match_flag_type __m = regex_constants::match_default);
#if _LIBCPP_STD_VER >= 14
  regex_iterator(_BidirectionalIterator __a,
                 _BidirectionalIterator __b,
                 const regex_type&& __re,
                 regex_constants::match_flag_type __m = regex_constants::match_default) = delete;
#endif

  _LIBCPP_HIDE_FROM_ABI bool operator==(const regex_iterator& __x) const;
#if _LIBCPP_STD_VER >= 20
  _LIBCPP_HIDE_FROM_ABI bool operator==(default_sentinel_t) const { return *this == regex_iterator(); }
#endif
#if _LIBCPP_STD_VER < 20
  _LIBCPP_HIDE_FROM_ABI bool operator!=(const regex_iterator& __x) const { return !(*this == __x); }
#endif

  _LIBCPP_HIDE_FROM_ABI reference operator*() const { return __match_; }
  _LIBCPP_HIDE_FROM_ABI pointer operator->() const { return std::addressof(__match_); }

  regex_iterator& operator++();
  _LIBCPP_HIDE_FROM_ABI regex_iterator operator++(int) {
    regex_iterator __t(*this);
    ++(*this);
    return __t;
  }
};

template <class _BidirectionalIterator, class _CharT, class _Traits>
regex_iterator<_BidirectionalIterator, _CharT, _Traits>::regex_iterator()
    : __begin_(), __end_(), __pregex_(nullptr), __flags_(), __match_() {}

template <class _BidirectionalIterator, class _CharT, class _Traits>
regex_iterator<_BidirectionalIterator, _CharT, _Traits>::regex_iterator(
    _BidirectionalIterator __a,
    _BidirectionalIterator __b,
    const regex_type& __re,
    regex_constants::match_flag_type __m)
    : __begin_(__a), __end_(__b), __pregex_(std::addressof(__re)), __flags_(__m) {
  std::regex_search(__begin_, __end_, __match_, *__pregex_, __flags_);
}

template <class _BidirectionalIterator, class _CharT, class _Traits>
bool regex_iterator<_BidirectionalIterator, _CharT, _Traits>::operator==(const regex_iterator& __x) const {
  if (__match_.empty() && __x.__match_.empty())
    return true;
  if (__match_.empty() || __x.__match_.empty())
    return false;
  return __begin_ == __x.__begin_ && __end_ == __x.__end_ && __pregex_ == __x.__pregex_ && __flags_ == __x.__flags_ &&
         __match_[0] == __x.__match_[0];
}

template <class _BidirectionalIterator, class _CharT, class _Traits>
regex_iterator<_BidirectionalIterator, _CharT, _Traits>&
regex_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++() {
  __flags_ |= regex_constants::__no_update_pos;
  _BidirectionalIterator __start        = __match_[0].second;
  _BidirectionalIterator __prefix_start = __start;

  if (__match_[0].first == __match_[0].second) {
    if (__start == __end_) {
      __match_ = value_type();
      return *this;
    } else if (std::regex_search(__start,
                                 __end_,
                                 __match_,
                                 *__pregex_,
                                 __flags_ | regex_constants::match_not_null | regex_constants::match_continuous))
      return *this;
    else
      ++__start;
  }

  __flags_ |= regex_constants::match_prev_avail;
  if (!std::regex_search(__start, __end_, __match_, *__pregex_, __flags_)) {
    __match_ = value_type();

  } else {
    // The Standard mandates that if `regex_search` returns true ([re.regiter.incr]), "`match.prefix().first` shall be
    // equal to the previous value of `match[0].second`... It is unspecified how the implementation makes these
    // adjustments." The adjustment is necessary if we incremented `__start` above (the branch that deals with
    // zero-length matches).
    auto& __prefix   = __match_.__prefix_;
    __prefix.first   = __prefix_start;
    __prefix.matched = __prefix.first != __prefix.second;
  }

  return *this;
}

// regex_token_iterator

template <class _BidirectionalIterator,
          class _CharT  = typename iterator_traits<_BidirectionalIterator>::value_type,
          class _Traits = regex_traits<_CharT> >
class _LIBCPP_TEMPLATE_VIS regex_token_iterator;

typedef regex_token_iterator<const char*> cregex_token_iterator;
typedef regex_token_iterator<string::const_iterator> sregex_token_iterator;
#if _LIBCPP_HAS_WIDE_CHARACTERS
typedef regex_token_iterator<const wchar_t*> wcregex_token_iterator;
typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator;
#endif

template <class _BidirectionalIterator, class _CharT, class _Traits>
class _LIBCPP_TEMPLATE_VIS _LIBCPP_PREFERRED_NAME(cregex_token_iterator)
    _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wcregex_token_iterator))
        _LIBCPP_PREFERRED_NAME(sregex_token_iterator)
            _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wsregex_token_iterator)) regex_token_iterator {
public:
  typedef basic_regex<_CharT, _Traits> regex_type;
  typedef sub_match<_BidirectionalIterator> value_type;
  typedef ptrdiff_t difference_type;
  typedef const value_type* pointer;
  typedef const value_type& reference;
  typedef forward_iterator_tag iterator_category;
#if _LIBCPP_STD_VER >= 20
  typedef input_iterator_tag iterator_concept;
#endif

private:
  typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Position;

  _Position __position_;
  const value_type* __result_;
  value_type __suffix_;
  ptrdiff_t __n_;
  vector<int> __subs_;

public:
  regex_token_iterator();
  regex_token_iterator(_BidirectionalIterator __a,
                       _BidirectionalIterator __b,
                       const regex_type& __re,
                       int __submatch                       = 0,
                       regex_constants::match_flag_type __m = regex_constants::match_default);
#if _LIBCPP_STD_VER >= 14
  regex_token_iterator(_BidirectionalIterator __a,
                       _BidirectionalIterator __b,
                       const regex_type&& __re,
                       int __submatch                       = 0,
                       regex_constants::match_flag_type __m = regex_constants::match_default) = delete;
#endif

  regex_token_iterator(_BidirectionalIterator __a,
                       _BidirectionalIterator __b,
                       const regex_type& __re,
                       const vector<int>& __submatches,
                       regex_constants::match_flag_type __m = regex_constants::match_default);
#if _LIBCPP_STD_VER >= 14
  regex_token_iterator(_BidirectionalIterator __a,
                       _BidirectionalIterator __b,
                       const regex_type&& __re,
                       const vector<int>& __submatches,
                       regex_constants::match_flag_type __m = regex_constants::match_default) = delete;
#endif

#ifndef _LIBCPP_CXX03_LANG
  regex_token_iterator(_BidirectionalIterator __a,
                       _BidirectionalIterator __b,
                       const regex_type& __re,
                       initializer_list<int> __submatches,
                       regex_constants::match_flag_type __m = regex_constants::match_default);

#  if _LIBCPP_STD_VER >= 14
  regex_token_iterator(_BidirectionalIterator __a,
                       _BidirectionalIterator __b,
                       const regex_type&& __re,
                       initializer_list<int> __submatches,
                       regex_constants::match_flag_type __m = regex_constants::match_default) = delete;
#  endif
#endif // _LIBCPP_CXX03_LANG
  template <size_t _Np>
  regex_token_iterator(_BidirectionalIterator __a,
                       _BidirectionalIterator __b,
                       const regex_type& __re,
                       const int (&__submatches)[_Np],
                       regex_constants::match_flag_type __m = regex_constants::match_default);
#if _LIBCPP_STD_VER >= 14
  template <size_t _Np>
  regex_token_iterator(_BidirectionalIterator __a,
                       _BidirectionalIterator __b,
                       const regex_type&& __re,
                       const int (&__submatches)[_Np],
                       regex_constants::match_flag_type __m = regex_constants::match_default) = delete;
#endif

  regex_token_iterator(const regex_token_iterator&);
  regex_token_iterator& operator=(const regex_token_iterator&);

  _LIBCPP_HIDE_FROM_ABI bool operator==(const regex_token_iterator& __x) const;
#if _LIBCPP_STD_VER >= 20
  _LIBCPP_HIDE_FROM_ABI _LIBCPP_HIDE_FROM_ABI bool operator==(default_sentinel_t) const {
    return *this == regex_token_iterator();
  }
#endif
#if _LIBCPP_STD_VER < 20
  _LIBCPP_HIDE_FROM_ABI bool operator!=(const regex_token_iterator& __x) const { return !(*this == __x); }
#endif

  _LIBCPP_HIDE_FROM_ABI const value_type& operator*() const { return *__result_; }
  _LIBCPP_HIDE_FROM_ABI const value_type* operator->() const { return __result_; }

  regex_token_iterator& operator++();
  _LIBCPP_HIDE_FROM_ABI regex_token_iterator operator++(int) {
    regex_token_iterator __t(*this);
    ++(*this);
    return __t;
  }

private:
  void __init(_BidirectionalIterator __a, _BidirectionalIterator __b);
  void __establish_result() {
    if (__subs_[__n_] == -1)
      __result_ = &__position_->prefix();
    else
      __result_ = &(*__position_)[__subs_[__n_]];
  }
};

template <class _BidirectionalIterator, class _CharT, class _Traits>
regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::regex_token_iterator()
    : __result_(nullptr), __suffix_(), __n_(0) {}

template <class _BidirectionalIterator, class _CharT, class _Traits>
void regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::__init(
    _BidirectionalIterator __a, _BidirectionalIterator __b) {
  if (__position_ != _Position())
    __establish_result();
  else if (__subs_[__n_] == -1) {
    __suffix_.matched = true;
    __suffix_.first   = __a;
    __suffix_.second  = __b;
    __result_         = &__suffix_;
  } else
    __result_ = nullptr;
}

template <class _BidirectionalIterator, class _CharT, class _Traits>
regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::regex_token_iterator(
    _BidirectionalIterator __a,
    _BidirectionalIterator __b,
    const regex_type& __re,
    int __submatch,
    regex_constants::match_flag_type __m)
    : __position_(__a, __b, __re, __m), __n_(0), __subs_(1, __submatch) {
  __init(__a, __b);
}

template <class _BidirectionalIterator, class _CharT, class _Traits>
regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::regex_token_iterator(
    _BidirectionalIterator __a,
    _BidirectionalIterator __b,
    const regex_type& __re,
    const vector<int>& __submatches,
    regex_constants::match_flag_type __m)
    : __position_(__a, __b, __re, __m), __n_(0), __subs_(__submatches) {
  __init(__a, __b);
}

#ifndef _LIBCPP_CXX03_LANG

template <class _BidirectionalIterator, class _CharT, class _Traits>
regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::regex_token_iterator(
    _BidirectionalIterator __a,
    _BidirectionalIterator __b,
    const regex_type& __re,
    initializer_list<int> __submatches,
    regex_constants::match_flag_type __m)
    : __position_(__a, __b, __re, __m), __n_(0), __subs_(__submatches) {
  __init(__a, __b);
}

#endif // _LIBCPP_CXX03_LANG

template <class _BidirectionalIterator, class _CharT, class _Traits>
template <size_t _Np>
regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::regex_token_iterator(
    _BidirectionalIterator __a,
    _BidirectionalIterator __b,
    const regex_type& __re,
    const int (&__submatches)[_Np],
    regex_constants::match_flag_type __m)
    : __position_(__a, __b, __re, __m), __n_(0), __subs_(begin(__submatches), end(__submatches)) {
  __init(__a, __b);
}

template <class _BidirectionalIterator, class _CharT, class _Traits>
regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::regex_token_iterator(const regex_token_iterator& __x)
    : __position_(__x.__position_),
      __result_(__x.__result_),
      __suffix_(__x.__suffix_),
      __n_(__x.__n_),
      __subs_(__x.__subs_) {
  if (__x.__result_ == &__x.__suffix_)
    __result_ = &__suffix_;
  else if (__result_ != nullptr)
    __establish_result();
}

template <class _BidirectionalIterator, class _CharT, class _Traits>
regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>&
regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::operator=(const regex_token_iterator& __x) {
  if (this != &__x) {
    __position_ = __x.__position_;
    if (__x.__result_ == &__x.__suffix_)
      __result_ = &__suffix_;
    else
      __result_ = __x.__result_;
    __suffix_ = __x.__suffix_;
    __n_      = __x.__n_;
    __subs_   = __x.__subs_;

    if (__result_ != nullptr && __result_ != &__suffix_)
      __establish_result();
  }
  return *this;
}

template <class _BidirectionalIterator, class _CharT, class _Traits>
bool regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::operator==(const regex_token_iterator& __x) const {
  if (__result_ == nullptr && __x.__result_ == nullptr)
    return true;
  if (__result_ == &__suffix_ && __x.__result_ == &__x.__suffix_ && __suffix_ == __x.__suffix_)
    return true;
  if (__result_ == nullptr || __x.__result_ == nullptr)
    return false;
  if (__result_ == &__suffix_ || __x.__result_ == &__x.__suffix_)
    return false;
  return __position_ == __x.__position_ && __n_ == __x.__n_ && __subs_ == __x.__subs_;
}

template <class _BidirectionalIterator, class _CharT, class _Traits>
regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>&
regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++() {
  _Position __prev = __position_;
  if (__result_ == &__suffix_)
    __result_ = nullptr;
  else if (static_cast<size_t>(__n_ + 1) < __subs_.size()) {
    ++__n_;
    __establish_result();
  } else {
    __n_ = 0;
    ++__position_;
    if (__position_ != _Position())
      __establish_result();
    else {
      if (std::find(__subs_.begin(), __subs_.end(), -1) != __subs_.end() && __prev->suffix().length() != 0) {
        __suffix_.matched = true;
        __suffix_.first   = __prev->suffix().first;
        __suffix_.second  = __prev->suffix().second;
        __result_         = &__suffix_;
      } else
        __result_ = nullptr;
    }
  }
  return *this;
}

// regex_replace

template <class _OutputIterator, class _BidirectionalIterator, class _Traits, class _CharT>
_LIBCPP_HIDE_FROM_ABI _OutputIterator regex_replace(
    _OutputIterator __output_iter,
    _BidirectionalIterator __first,
    _BidirectionalIterator __last,
    const basic_regex<_CharT, _Traits>& __e,
    const _CharT* __fmt,
    regex_constants::match_flag_type __flags = regex_constants::match_default) {
  typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Iter;
  _Iter __i(__first, __last, __e, __flags);
  _Iter __eof;
  if (__i == __eof) {
    if (!(__flags & regex_constants::format_no_copy))
      __output_iter = std::copy(__first, __last, __output_iter);
  } else {
    sub_match<_BidirectionalIterator> __lm;
    for (size_t __len = char_traits<_CharT>::length(__fmt); __i != __eof; ++__i) {
      if (!(__flags & regex_constants::format_no_copy))
        __output_iter = std::copy(__i->prefix().first, __i->prefix().second, __output_iter);
      __output_iter = __i->format(__output_iter, __fmt, __fmt + __len, __flags);
      __lm          = __i->suffix();
      if (__flags & regex_constants::format_first_only)
        break;
    }
    if (!(__flags & regex_constants::format_no_copy))
      __output_iter = std::copy(__lm.first, __lm.second, __output_iter);
  }
  return __output_iter;
}

template <class _OutputIterator, class _BidirectionalIterator, class _Traits, class _CharT, class _ST, class _SA>
inline _LIBCPP_HIDE_FROM_ABI _OutputIterator regex_replace(
    _OutputIterator __output_iter,
    _BidirectionalIterator __first,
    _BidirectionalIterator __last,
    const basic_regex<_CharT, _Traits>& __e,
    const basic_string<_CharT, _ST, _SA>& __fmt,
    regex_constants::match_flag_type __flags = regex_constants::match_default) {
  return std::regex_replace(__output_iter, __first, __last, __e, __fmt.c_str(), __flags);
}

template <class _Traits, class _CharT, class _ST, class _SA, class _FST, class _FSA>
inline _LIBCPP_HIDE_FROM_ABI basic_string<_CharT, _ST, _SA>
regex_replace(const basic_string<_CharT, _ST, _SA>& __s,
              const basic_regex<_CharT, _Traits>& __e,
              const basic_string<_CharT, _FST, _FSA>& __fmt,
              regex_constants::match_flag_type __flags = regex_constants::match_default) {
  basic_string<_CharT, _ST, _SA> __r;
  std::regex_replace(std::back_inserter(__r), __s.begin(), __s.end(), __e, __fmt.c_str(), __flags);
  return __r;
}

template <class _Traits, class _CharT, class _ST, class _SA>
inline _LIBCPP_HIDE_FROM_ABI basic_string<_CharT, _ST, _SA>
regex_replace(const basic_string<_CharT, _ST, _SA>& __s,
              const basic_regex<_CharT, _Traits>& __e,
              const _CharT* __fmt,
              regex_constants::match_flag_type __flags = regex_constants::match_default) {
  basic_string<_CharT, _ST, _SA> __r;
  std::regex_replace(std::back_inserter(__r), __s.begin(), __s.end(), __e, __fmt, __flags);
  return __r;
}

template <class _Traits, class _CharT, class _ST, class _SA>
inline _LIBCPP_HIDE_FROM_ABI basic_string<_CharT>
regex_replace(const _CharT* __s,
              const basic_regex<_CharT, _Traits>& __e,
              const basic_string<_CharT, _ST, _SA>& __fmt,
              regex_constants::match_flag_type __flags = regex_constants::match_default) {
  basic_string<_CharT> __r;
  std::regex_replace(std::back_inserter(__r), __s, __s + char_traits<_CharT>::length(__s), __e, __fmt.c_str(), __flags);
  return __r;
}

template <class _Traits, class _CharT>
inline _LIBCPP_HIDE_FROM_ABI basic_string<_CharT>
regex_replace(const _CharT* __s,
              const basic_regex<_CharT, _Traits>& __e,
              const _CharT* __fmt,
              regex_constants::match_flag_type __flags = regex_constants::match_default) {
  basic_string<_CharT> __r;
  std::regex_replace(std::back_inserter(__r), __s, __s + char_traits<_CharT>::length(__s), __e, __fmt, __flags);
  return __r;
}

_LIBCPP_END_NAMESPACE_STD

#if _LIBCPP_STD_VER >= 17
_LIBCPP_BEGIN_NAMESPACE_STD
namespace pmr {
template <class _BidirT>
using match_results _LIBCPP_AVAILABILITY_PMR =
    std::match_results<_BidirT, polymorphic_allocator<std::sub_match<_BidirT>>>;

using cmatch _LIBCPP_AVAILABILITY_PMR = match_results<const char*>;
using smatch _LIBCPP_AVAILABILITY_PMR = match_results<std::pmr::string::const_iterator>;

#  if _LIBCPP_HAS_WIDE_CHARACTERS
using wcmatch _LIBCPP_AVAILABILITY_PMR = match_results<const wchar_t*>;
using wsmatch _LIBCPP_AVAILABILITY_PMR = match_results<std::pmr::wstring::const_iterator>;
#  endif
} // namespace pmr
_LIBCPP_END_NAMESPACE_STD
#endif

_LIBCPP_POP_MACROS

#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
#  include <atomic>
#  include <concepts>
#  include <cstdlib>
#  include <iosfwd>
#  include <iterator>
#  include <mutex>
#  include <new>
#  include <type_traits>
#  include <typeinfo>
#  include <utility>
#endif

#endif // _LIBCPP_REGEX
