InfiniTime.git

commit e75b89bbc6a072b3611f96873dd35fa36ce1209d

Author: Riku Isokoski <riksu9000@gmail.com>

Remove copy of date lib

 src/libs/date/includes/date/chrono_io.h | 34 
 src/libs/date/includes/date/date.h | 7947 --------------------------
 src/libs/date/includes/date/ios.h | 50 
 src/libs/date/includes/date/islamic.h | 3031 ---------
 src/libs/date/includes/date/iso_week.h | 1751 -----
 src/libs/date/includes/date/julian.h | 3046 ---------
 src/libs/date/includes/date/ptz.h | 627 --
 src/libs/date/includes/date/tz.h | 2775 ---------
 src/libs/date/includes/date/tz_private.h | 316 -
 src/libs/date/src/tz.cpp | 3825 ------------


diff --git a/src/libs/date/includes/date/chrono_io.h b/src/libs/date/includes/date/chrono_io.h
deleted file mode 100644
index 21be404097e0d0ad6dbdbcc2fc5dc447ffdc64a6..0000000000000000000000000000000000000000
--- a/src/libs/date/includes/date/chrono_io.h
+++ /dev/null
@@ -1,34 +0,0 @@
-#ifndef CHRONO_IO_H
-#define CHRONO_IO_H
-
-// The MIT License (MIT)
-//
-// Copyright (c) 2016, 2017 Howard Hinnant
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-//
-// Our apologies.  When the previous paragraph was written, lowercase had not yet
-// been invented (that would involve another several millennia of evolution).
-// We did not mean to shout.
-
-// This functionality has moved to "date.h"
-
-#include "date.h"
-
-#endif  // CHRONO_IO_H




diff --git a/src/libs/date/includes/date/date.h b/src/libs/date/includes/date/date.h
deleted file mode 100644
index 027a5a46cdee90bc860fcb6ec1ef633438827f46..0000000000000000000000000000000000000000
--- a/src/libs/date/includes/date/date.h
+++ /dev/null
@@ -1,7947 +0,0 @@
-#ifndef DATE_H
-#define DATE_H
-
-// The MIT License (MIT)
-//
-// Copyright (c) 2015, 2016, 2017 Howard Hinnant
-// Copyright (c) 2016 Adrian Colomitchi
-// Copyright (c) 2017 Florian Dang
-// Copyright (c) 2017 Paul Thompson
-// Copyright (c) 2018, 2019 Tomasz KamiƄski
-// Copyright (c) 2019 Jiangang Zhuang
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-//
-// Our apologies.  When the previous paragraph was written, lowercase had not yet
-// been invented (that would involve another several millennia of evolution).
-// We did not mean to shout.
-
-#ifndef HAS_STRING_VIEW
-#  if __cplusplus >= 201703 || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)
-#    define HAS_STRING_VIEW 1
-#  else
-#    define HAS_STRING_VIEW 0
-#  endif
-#endif  // HAS_STRING_VIEW
-
-#include <cassert>
-#include <algorithm>
-#include <cctype>
-#include <chrono>
-#include <climits>
-#if !(__cplusplus >= 201402)
-#  include <cmath>
-#endif
-#include <cstddef>
-#include <cstdint>
-#include <cstdlib>
-#include <ctime>
-#include <ios>
-#include <istream>
-#include <iterator>
-#include <limits>
-#include <locale>
-#include <memory>
-#include <ostream>
-#include <ratio>
-#include <sstream>
-#include <stdexcept>
-#include <string>
-#if HAS_STRING_VIEW
-# include <string_view>
-#endif
-#include <utility>
-#include <type_traits>
-
-#ifdef __GNUC__
-# pragma GCC diagnostic push
-# if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR > 7)
-#  pragma GCC diagnostic ignored "-Wpedantic"
-# endif
-# if __GNUC__ < 5
-   // GCC 4.9 Bug 61489 Wrong warning with -Wmissing-field-initializers
-#  pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-# endif
-#endif
-
-#ifdef _MSC_VER
-#   pragma warning(push)
-// warning C4127: conditional expression is constant
-#   pragma warning(disable : 4127)
-#endif
-
-namespace date
-{
-
-//---------------+
-// Configuration |
-//---------------+
-
-#ifndef ONLY_C_LOCALE
-#  define ONLY_C_LOCALE 0
-#endif
-
-#if defined(_MSC_VER) && (!defined(__clang__) || (_MSC_VER < 1910))
-// MSVC
-#  ifndef _SILENCE_CXX17_UNCAUGHT_EXCEPTION_DEPRECATION_WARNING
-#    define _SILENCE_CXX17_UNCAUGHT_EXCEPTION_DEPRECATION_WARNING
-#  endif
-#  if _MSC_VER < 1910
-//   before VS2017
-#    define CONSTDATA const
-#    define CONSTCD11
-#    define CONSTCD14
-#    define NOEXCEPT _NOEXCEPT
-#  else
-//   VS2017 and later
-#    define CONSTDATA constexpr const
-#    define CONSTCD11 constexpr
-#    define CONSTCD14 constexpr
-#    define NOEXCEPT noexcept
-#  endif
-
-#elif defined(__SUNPRO_CC) && __SUNPRO_CC <= 0x5150
-// Oracle Developer Studio 12.6 and earlier
-#  define CONSTDATA constexpr const
-#  define CONSTCD11 constexpr
-#  define CONSTCD14
-#  define NOEXCEPT noexcept
-
-#elif __cplusplus >= 201402
-// C++14
-#  define CONSTDATA constexpr const
-#  define CONSTCD11 constexpr
-#  define CONSTCD14 constexpr
-#  define NOEXCEPT noexcept
-#else
-// C++11
-#  define CONSTDATA constexpr const
-#  define CONSTCD11 constexpr
-#  define CONSTCD14
-#  define NOEXCEPT noexcept
-#endif
-
-#ifndef HAS_UNCAUGHT_EXCEPTIONS
-#  if __cplusplus > 201703 || (defined(_MSVC_LANG) && _MSVC_LANG > 201703L)
-#    define HAS_UNCAUGHT_EXCEPTIONS 1
-#  else
-#    define HAS_UNCAUGHT_EXCEPTIONS 0
-#  endif
-#endif  // HAS_UNCAUGHT_EXCEPTIONS
-
-#ifndef HAS_VOID_T
-#  if __cplusplus >= 201703 || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)
-#    define HAS_VOID_T 1
-#  else
-#    define HAS_VOID_T 0
-#  endif
-#endif  // HAS_VOID_T
-
-// Protect from Oracle sun macro
-#ifdef sun
-#  undef sun
-#endif
-
-// Work around for a NVCC compiler bug which causes it to fail
-// to compile std::ratio_{multiply,divide} when used directly
-// in the std::chrono::duration template instantiations below
-namespace detail {
-template <typename R1, typename R2>
-using ratio_multiply = decltype(std::ratio_multiply<R1, R2>{});
-
-template <typename R1, typename R2>
-using ratio_divide = decltype(std::ratio_divide<R1, R2>{});
-}  // namespace detail
-
-//-----------+
-// Interface |
-//-----------+
-
-// durations
-
-using days = std::chrono::duration
-    <int, detail::ratio_multiply<std::ratio<24>, std::chrono::hours::period>>;
-
-using weeks = std::chrono::duration
-    <int, detail::ratio_multiply<std::ratio<7>, days::period>>;
-
-using years = std::chrono::duration
-    <int, detail::ratio_multiply<std::ratio<146097, 400>, days::period>>;
-
-using months = std::chrono::duration
-    <int, detail::ratio_divide<years::period, std::ratio<12>>>;
-
-// time_point
-
-template <class Duration>
-    using sys_time = std::chrono::time_point<std::chrono::system_clock, Duration>;
-
-using sys_days    = sys_time<days>;
-using sys_seconds = sys_time<std::chrono::seconds>;
-
-struct local_t {};
-
-template <class Duration>
-    using local_time = std::chrono::time_point<local_t, Duration>;
-
-using local_seconds = local_time<std::chrono::seconds>;
-using local_days    = local_time<days>;
-
-// types
-
-struct last_spec
-{
-    explicit last_spec() = default;
-};
-
-class day;
-class month;
-class year;
-
-class weekday;
-class weekday_indexed;
-class weekday_last;
-
-class month_day;
-class month_day_last;
-class month_weekday;
-class month_weekday_last;
-
-class year_month;
-
-class year_month_day;
-class year_month_day_last;
-class year_month_weekday;
-class year_month_weekday_last;
-
-// date composition operators
-
-CONSTCD11 year_month operator/(const year& y, const month& m) NOEXCEPT;
-CONSTCD11 year_month operator/(const year& y, int          m) NOEXCEPT;
-
-CONSTCD11 month_day operator/(const day& d, const month& m) NOEXCEPT;
-CONSTCD11 month_day operator/(const day& d, int          m) NOEXCEPT;
-CONSTCD11 month_day operator/(const month& m, const day& d) NOEXCEPT;
-CONSTCD11 month_day operator/(const month& m, int        d) NOEXCEPT;
-CONSTCD11 month_day operator/(int          m, const day& d) NOEXCEPT;
-
-CONSTCD11 month_day_last operator/(const month& m, last_spec) NOEXCEPT;
-CONSTCD11 month_day_last operator/(int          m, last_spec) NOEXCEPT;
-CONSTCD11 month_day_last operator/(last_spec, const month& m) NOEXCEPT;
-CONSTCD11 month_day_last operator/(last_spec, int          m) NOEXCEPT;
-
-CONSTCD11 month_weekday operator/(const month& m, const weekday_indexed& wdi) NOEXCEPT;
-CONSTCD11 month_weekday operator/(int          m, const weekday_indexed& wdi) NOEXCEPT;
-CONSTCD11 month_weekday operator/(const weekday_indexed& wdi, const month& m) NOEXCEPT;
-CONSTCD11 month_weekday operator/(const weekday_indexed& wdi, int          m) NOEXCEPT;
-
-CONSTCD11 month_weekday_last operator/(const month& m, const weekday_last& wdl) NOEXCEPT;
-CONSTCD11 month_weekday_last operator/(int          m, const weekday_last& wdl) NOEXCEPT;
-CONSTCD11 month_weekday_last operator/(const weekday_last& wdl, const month& m) NOEXCEPT;
-CONSTCD11 month_weekday_last operator/(const weekday_last& wdl, int          m) NOEXCEPT;
-
-CONSTCD11 year_month_day operator/(const year_month& ym, const day& d) NOEXCEPT;
-CONSTCD11 year_month_day operator/(const year_month& ym, int        d) NOEXCEPT;
-CONSTCD11 year_month_day operator/(const year& y, const month_day& md) NOEXCEPT;
-CONSTCD11 year_month_day operator/(int         y, const month_day& md) NOEXCEPT;
-CONSTCD11 year_month_day operator/(const month_day& md, const year& y) NOEXCEPT;
-CONSTCD11 year_month_day operator/(const month_day& md, int         y) NOEXCEPT;
-
-CONSTCD11
-    year_month_day_last operator/(const year_month& ym,   last_spec) NOEXCEPT;
-CONSTCD11
-    year_month_day_last operator/(const year& y, const month_day_last& mdl) NOEXCEPT;
-CONSTCD11
-    year_month_day_last operator/(int         y, const month_day_last& mdl) NOEXCEPT;
-CONSTCD11
-    year_month_day_last operator/(const month_day_last& mdl, const year& y) NOEXCEPT;
-CONSTCD11
-    year_month_day_last operator/(const month_day_last& mdl, int         y) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator/(const year_month& ym, const weekday_indexed& wdi) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator/(const year&        y, const month_weekday&   mwd) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator/(int                y, const month_weekday&   mwd) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator/(const month_weekday& mwd, const year&          y) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator/(const month_weekday& mwd, int                  y) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator/(const year_month& ym, const weekday_last& wdl) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator/(const year& y, const month_weekday_last& mwdl) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator/(int         y, const month_weekday_last& mwdl) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator/(const month_weekday_last& mwdl, const year& y) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator/(const month_weekday_last& mwdl, int         y) NOEXCEPT;
-
-// Detailed interface
-
-// day
-
-class day
-{
-    unsigned char d_;
-
-public:
-    day() = default;
-    explicit CONSTCD11 day(unsigned d) NOEXCEPT;
-
-    CONSTCD14 day& operator++()    NOEXCEPT;
-    CONSTCD14 day  operator++(int) NOEXCEPT;
-    CONSTCD14 day& operator--()    NOEXCEPT;
-    CONSTCD14 day  operator--(int) NOEXCEPT;
-
-    CONSTCD14 day& operator+=(const days& d) NOEXCEPT;
-    CONSTCD14 day& operator-=(const days& d) NOEXCEPT;
-
-    CONSTCD11 explicit operator unsigned() const NOEXCEPT;
-    CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const day& x, const day& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const day& x, const day& y) NOEXCEPT;
-CONSTCD11 bool operator< (const day& x, const day& y) NOEXCEPT;
-CONSTCD11 bool operator> (const day& x, const day& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const day& x, const day& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const day& x, const day& y) NOEXCEPT;
-
-CONSTCD11 day  operator+(const day&  x, const days& y) NOEXCEPT;
-CONSTCD11 day  operator+(const days& x, const day&  y) NOEXCEPT;
-CONSTCD11 day  operator-(const day&  x, const days& y) NOEXCEPT;
-CONSTCD11 days operator-(const day&  x, const day&  y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const day& d);
-
-// month
-
-class month
-{
-    unsigned char m_;
-
-public:
-    month() = default;
-    explicit CONSTCD11 month(unsigned m) NOEXCEPT;
-
-    CONSTCD14 month& operator++()    NOEXCEPT;
-    CONSTCD14 month  operator++(int) NOEXCEPT;
-    CONSTCD14 month& operator--()    NOEXCEPT;
-    CONSTCD14 month  operator--(int) NOEXCEPT;
-
-    CONSTCD14 month& operator+=(const months& m) NOEXCEPT;
-    CONSTCD14 month& operator-=(const months& m) NOEXCEPT;
-
-    CONSTCD11 explicit operator unsigned() const NOEXCEPT;
-    CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const month& x, const month& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const month& x, const month& y) NOEXCEPT;
-CONSTCD11 bool operator< (const month& x, const month& y) NOEXCEPT;
-CONSTCD11 bool operator> (const month& x, const month& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const month& x, const month& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const month& x, const month& y) NOEXCEPT;
-
-CONSTCD14 month  operator+(const month&  x, const months& y) NOEXCEPT;
-CONSTCD14 month  operator+(const months& x,  const month& y) NOEXCEPT;
-CONSTCD14 month  operator-(const month&  x, const months& y) NOEXCEPT;
-CONSTCD14 months operator-(const month&  x,  const month& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month& m);
-
-// year
-
-class year
-{
-    short y_;
-
-public:
-    year() = default;
-    explicit CONSTCD11 year(int y) NOEXCEPT;
-
-    CONSTCD14 year& operator++()    NOEXCEPT;
-    CONSTCD14 year  operator++(int) NOEXCEPT;
-    CONSTCD14 year& operator--()    NOEXCEPT;
-    CONSTCD14 year  operator--(int) NOEXCEPT;
-
-    CONSTCD14 year& operator+=(const years& y) NOEXCEPT;
-    CONSTCD14 year& operator-=(const years& y) NOEXCEPT;
-
-    CONSTCD11 year operator-() const NOEXCEPT;
-    CONSTCD11 year operator+() const NOEXCEPT;
-
-    CONSTCD11 bool is_leap() const NOEXCEPT;
-
-    CONSTCD11 explicit operator int() const NOEXCEPT;
-    CONSTCD11 bool ok() const NOEXCEPT;
-
-    static CONSTCD11 year min() NOEXCEPT { return year{-32767}; }
-    static CONSTCD11 year max() NOEXCEPT { return year{32767}; }
-};
-
-CONSTCD11 bool operator==(const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator< (const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator> (const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const year& x, const year& y) NOEXCEPT;
-
-CONSTCD11 year  operator+(const year&  x, const years& y) NOEXCEPT;
-CONSTCD11 year  operator+(const years& x, const year&  y) NOEXCEPT;
-CONSTCD11 year  operator-(const year&  x, const years& y) NOEXCEPT;
-CONSTCD11 years operator-(const year&  x, const year&  y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year& y);
-
-// weekday
-
-class weekday
-{
-    unsigned char wd_;
-public:
-    weekday() = default;
-    explicit CONSTCD11 weekday(unsigned wd) NOEXCEPT;
-    CONSTCD14 weekday(const sys_days& dp) NOEXCEPT;
-    CONSTCD14 explicit weekday(const local_days& dp) NOEXCEPT;
-
-    CONSTCD14 weekday& operator++()    NOEXCEPT;
-    CONSTCD14 weekday  operator++(int) NOEXCEPT;
-    CONSTCD14 weekday& operator--()    NOEXCEPT;
-    CONSTCD14 weekday  operator--(int) NOEXCEPT;
-
-    CONSTCD14 weekday& operator+=(const days& d) NOEXCEPT;
-    CONSTCD14 weekday& operator-=(const days& d) NOEXCEPT;
-
-    CONSTCD11 bool ok() const NOEXCEPT;
-
-    CONSTCD11 unsigned c_encoding() const NOEXCEPT;
-    CONSTCD11 unsigned iso_encoding() const NOEXCEPT;
-
-    CONSTCD11 weekday_indexed operator[](unsigned index) const NOEXCEPT;
-    CONSTCD11 weekday_last    operator[](last_spec)      const NOEXCEPT;
-
-private:
-    static CONSTCD14 unsigned char weekday_from_days(int z) NOEXCEPT;
-
-    friend CONSTCD11 bool operator==(const weekday& x, const weekday& y) NOEXCEPT;
-    friend CONSTCD14 days operator-(const weekday& x, const weekday& y) NOEXCEPT;
-    friend CONSTCD14 weekday operator+(const weekday& x, const days& y) NOEXCEPT;
-    template<class CharT, class Traits>
-        friend std::basic_ostream<CharT, Traits>&
-            operator<<(std::basic_ostream<CharT, Traits>& os, const weekday& wd);
-    friend class weekday_indexed;
-};
-
-CONSTCD11 bool operator==(const weekday& x, const weekday& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const weekday& x, const weekday& y) NOEXCEPT;
-
-CONSTCD14 weekday operator+(const weekday& x, const days&    y) NOEXCEPT;
-CONSTCD14 weekday operator+(const days&    x, const weekday& y) NOEXCEPT;
-CONSTCD14 weekday operator-(const weekday& x, const days&    y) NOEXCEPT;
-CONSTCD14 days    operator-(const weekday& x, const weekday& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday& wd);
-
-// weekday_indexed
-
-class weekday_indexed
-{
-    unsigned char wd_    : 4;
-    unsigned char index_ : 4;
-
-public:
-    weekday_indexed() = default;
-    CONSTCD11 weekday_indexed(const date::weekday& wd, unsigned index) NOEXCEPT;
-
-    CONSTCD11 date::weekday weekday() const NOEXCEPT;
-    CONSTCD11 unsigned index() const NOEXCEPT;
-    CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday_indexed& wdi);
-
-// weekday_last
-
-class weekday_last
-{
-    date::weekday wd_;
-
-public:
-    explicit CONSTCD11 weekday_last(const date::weekday& wd) NOEXCEPT;
-
-    CONSTCD11 date::weekday weekday() const NOEXCEPT;
-    CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const weekday_last& x, const weekday_last& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const weekday_last& x, const weekday_last& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday_last& wdl);
-
-namespace detail
-{
-
-struct unspecified_month_disambiguator {};
-
-}  // namespace detail
-
-// year_month
-
-class year_month
-{
-    date::year  y_;
-    date::month m_;
-
-public:
-    year_month() = default;
-    CONSTCD11 year_month(const date::year& y, const date::month& m) NOEXCEPT;
-
-    CONSTCD11 date::year  year()  const NOEXCEPT;
-    CONSTCD11 date::month month() const NOEXCEPT;
-
-    template<class = detail::unspecified_month_disambiguator>
-    CONSTCD14 year_month& operator+=(const months& dm) NOEXCEPT;
-    template<class = detail::unspecified_month_disambiguator>
-    CONSTCD14 year_month& operator-=(const months& dm) NOEXCEPT;
-    CONSTCD14 year_month& operator+=(const years& dy) NOEXCEPT;
-    CONSTCD14 year_month& operator-=(const years& dy) NOEXCEPT;
-
-    CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const year_month& x, const year_month& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const year_month& x, const year_month& y) NOEXCEPT;
-CONSTCD11 bool operator< (const year_month& x, const year_month& y) NOEXCEPT;
-CONSTCD11 bool operator> (const year_month& x, const year_month& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const year_month& x, const year_month& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const year_month& x, const year_month& y) NOEXCEPT;
-
-template<class = detail::unspecified_month_disambiguator>
-CONSTCD14 year_month operator+(const year_month& ym, const months& dm) NOEXCEPT;
-template<class = detail::unspecified_month_disambiguator>
-CONSTCD14 year_month operator+(const months& dm, const year_month& ym) NOEXCEPT;
-template<class = detail::unspecified_month_disambiguator>
-CONSTCD14 year_month operator-(const year_month& ym, const months& dm) NOEXCEPT;
-
-CONSTCD11 months operator-(const year_month& x, const year_month& y) NOEXCEPT;
-CONSTCD11 year_month operator+(const year_month& ym, const years& dy) NOEXCEPT;
-CONSTCD11 year_month operator+(const years& dy, const year_month& ym) NOEXCEPT;
-CONSTCD11 year_month operator-(const year_month& ym, const years& dy) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month& ym);
-
-// month_day
-
-class month_day
-{
-    date::month m_;
-    date::day   d_;
-
-public:
-    month_day() = default;
-    CONSTCD11 month_day(const date::month& m, const date::day& d) NOEXCEPT;
-
-    CONSTCD11 date::month month() const NOEXCEPT;
-    CONSTCD11 date::day   day() const NOEXCEPT;
-
-    CONSTCD14 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const month_day& x, const month_day& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const month_day& x, const month_day& y) NOEXCEPT;
-CONSTCD11 bool operator< (const month_day& x, const month_day& y) NOEXCEPT;
-CONSTCD11 bool operator> (const month_day& x, const month_day& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const month_day& x, const month_day& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const month_day& x, const month_day& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_day& md);
-
-// month_day_last
-
-class month_day_last
-{
-    date::month m_;
-
-public:
-    CONSTCD11 explicit month_day_last(const date::month& m) NOEXCEPT;
-
-    CONSTCD11 date::month month() const NOEXCEPT;
-    CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const month_day_last& x, const month_day_last& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const month_day_last& x, const month_day_last& y) NOEXCEPT;
-CONSTCD11 bool operator< (const month_day_last& x, const month_day_last& y) NOEXCEPT;
-CONSTCD11 bool operator> (const month_day_last& x, const month_day_last& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const month_day_last& x, const month_day_last& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const month_day_last& x, const month_day_last& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_day_last& mdl);
-
-// month_weekday
-
-class month_weekday
-{
-    date::month           m_;
-    date::weekday_indexed wdi_;
-public:
-    CONSTCD11 month_weekday(const date::month& m,
-                            const date::weekday_indexed& wdi) NOEXCEPT;
-
-    CONSTCD11 date::month           month()           const NOEXCEPT;
-    CONSTCD11 date::weekday_indexed weekday_indexed() const NOEXCEPT;
-
-    CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const month_weekday& x, const month_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const month_weekday& x, const month_weekday& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_weekday& mwd);
-
-// month_weekday_last
-
-class month_weekday_last
-{
-    date::month        m_;
-    date::weekday_last wdl_;
-
-public:
-    CONSTCD11 month_weekday_last(const date::month& m,
-                                 const date::weekday_last& wd) NOEXCEPT;
-
-    CONSTCD11 date::month        month()        const NOEXCEPT;
-    CONSTCD11 date::weekday_last weekday_last() const NOEXCEPT;
-
-    CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11
-    bool operator==(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT;
-CONSTCD11
-    bool operator!=(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_weekday_last& mwdl);
-
-// class year_month_day
-
-class year_month_day
-{
-    date::year  y_;
-    date::month m_;
-    date::day   d_;
-
-public:
-    year_month_day() = default;
-    CONSTCD11 year_month_day(const date::year& y, const date::month& m,
-                             const date::day& d) NOEXCEPT;
-    CONSTCD14 year_month_day(const year_month_day_last& ymdl) NOEXCEPT;
-
-    CONSTCD14 year_month_day(sys_days dp) NOEXCEPT;
-    CONSTCD14 explicit year_month_day(local_days dp) NOEXCEPT;
-
-    template<class = detail::unspecified_month_disambiguator>
-    CONSTCD14 year_month_day& operator+=(const months& m) NOEXCEPT;
-    template<class = detail::unspecified_month_disambiguator>
-    CONSTCD14 year_month_day& operator-=(const months& m) NOEXCEPT;
-    CONSTCD14 year_month_day& operator+=(const years& y)  NOEXCEPT;
-    CONSTCD14 year_month_day& operator-=(const years& y)  NOEXCEPT;
-
-    CONSTCD11 date::year  year()  const NOEXCEPT;
-    CONSTCD11 date::month month() const NOEXCEPT;
-    CONSTCD11 date::day   day()   const NOEXCEPT;
-
-    CONSTCD14 operator sys_days() const NOEXCEPT;
-    CONSTCD14 explicit operator local_days() const NOEXCEPT;
-    CONSTCD14 bool ok() const NOEXCEPT;
-
-private:
-    static CONSTCD14 year_month_day from_days(days dp) NOEXCEPT;
-    CONSTCD14 days to_days() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const year_month_day& x, const year_month_day& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const year_month_day& x, const year_month_day& y) NOEXCEPT;
-CONSTCD11 bool operator< (const year_month_day& x, const year_month_day& y) NOEXCEPT;
-CONSTCD11 bool operator> (const year_month_day& x, const year_month_day& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const year_month_day& x, const year_month_day& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const year_month_day& x, const year_month_day& y) NOEXCEPT;
-
-template<class = detail::unspecified_month_disambiguator>
-CONSTCD14 year_month_day operator+(const year_month_day& ymd, const months& dm) NOEXCEPT;
-template<class = detail::unspecified_month_disambiguator>
-CONSTCD14 year_month_day operator+(const months& dm, const year_month_day& ymd) NOEXCEPT;
-template<class = detail::unspecified_month_disambiguator>
-CONSTCD14 year_month_day operator-(const year_month_day& ymd, const months& dm) NOEXCEPT;
-CONSTCD11 year_month_day operator+(const year_month_day& ymd, const years& dy)  NOEXCEPT;
-CONSTCD11 year_month_day operator+(const years& dy, const year_month_day& ymd)  NOEXCEPT;
-CONSTCD11 year_month_day operator-(const year_month_day& ymd, const years& dy)  NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_day& ymd);
-
-// year_month_day_last
-
-class year_month_day_last
-{
-    date::year           y_;
-    date::month_day_last mdl_;
-
-public:
-    CONSTCD11 year_month_day_last(const date::year& y,
-                                  const date::month_day_last& mdl) NOEXCEPT;
-
-    template<class = detail::unspecified_month_disambiguator>
-    CONSTCD14 year_month_day_last& operator+=(const months& m) NOEXCEPT;
-    template<class = detail::unspecified_month_disambiguator>
-    CONSTCD14 year_month_day_last& operator-=(const months& m) NOEXCEPT;
-    CONSTCD14 year_month_day_last& operator+=(const years& y)  NOEXCEPT;
-    CONSTCD14 year_month_day_last& operator-=(const years& y)  NOEXCEPT;
-
-    CONSTCD11 date::year           year()           const NOEXCEPT;
-    CONSTCD11 date::month          month()          const NOEXCEPT;
-    CONSTCD11 date::month_day_last month_day_last() const NOEXCEPT;
-    CONSTCD14 date::day            day()            const NOEXCEPT;
-
-    CONSTCD14 operator sys_days() const NOEXCEPT;
-    CONSTCD14 explicit operator local_days() const NOEXCEPT;
-    CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11
-    bool operator==(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT;
-CONSTCD11
-    bool operator!=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT;
-CONSTCD11
-    bool operator< (const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT;
-CONSTCD11
-    bool operator> (const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT;
-CONSTCD11
-    bool operator<=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT;
-CONSTCD11
-    bool operator>=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT;
-
-template<class = detail::unspecified_month_disambiguator>
-CONSTCD14
-year_month_day_last
-operator+(const year_month_day_last& ymdl, const months& dm) NOEXCEPT;
-
-template<class = detail::unspecified_month_disambiguator>
-CONSTCD14
-year_month_day_last
-operator+(const months& dm, const year_month_day_last& ymdl) NOEXCEPT;
-
-CONSTCD11
-year_month_day_last
-operator+(const year_month_day_last& ymdl, const years& dy) NOEXCEPT;
-
-CONSTCD11
-year_month_day_last
-operator+(const years& dy, const year_month_day_last& ymdl) NOEXCEPT;
-
-template<class = detail::unspecified_month_disambiguator>
-CONSTCD14
-year_month_day_last
-operator-(const year_month_day_last& ymdl, const months& dm) NOEXCEPT;
-
-CONSTCD11
-year_month_day_last
-operator-(const year_month_day_last& ymdl, const years& dy) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_day_last& ymdl);
-
-// year_month_weekday
-
-class year_month_weekday
-{
-    date::year            y_;
-    date::month           m_;
-    date::weekday_indexed wdi_;
-
-public:
-    year_month_weekday() = default;
-    CONSTCD11 year_month_weekday(const date::year& y, const date::month& m,
-                                   const date::weekday_indexed& wdi) NOEXCEPT;
-    CONSTCD14 year_month_weekday(const sys_days& dp) NOEXCEPT;
-    CONSTCD14 explicit year_month_weekday(const local_days& dp) NOEXCEPT;
-
-    template<class = detail::unspecified_month_disambiguator>
-    CONSTCD14 year_month_weekday& operator+=(const months& m) NOEXCEPT;
-    template<class = detail::unspecified_month_disambiguator>
-    CONSTCD14 year_month_weekday& operator-=(const months& m) NOEXCEPT;
-    CONSTCD14 year_month_weekday& operator+=(const years& y)  NOEXCEPT;
-    CONSTCD14 year_month_weekday& operator-=(const years& y)  NOEXCEPT;
-
-    CONSTCD11 date::year year() const NOEXCEPT;
-    CONSTCD11 date::month month() const NOEXCEPT;
-    CONSTCD11 date::weekday weekday() const NOEXCEPT;
-    CONSTCD11 unsigned index() const NOEXCEPT;
-    CONSTCD11 date::weekday_indexed weekday_indexed() const NOEXCEPT;
-
-    CONSTCD14 operator sys_days() const NOEXCEPT;
-    CONSTCD14 explicit operator local_days() const NOEXCEPT;
-    CONSTCD14 bool ok() const NOEXCEPT;
-
-private:
-    static CONSTCD14 year_month_weekday from_days(days dp) NOEXCEPT;
-    CONSTCD14 days to_days() const NOEXCEPT;
-};
-
-CONSTCD11
-    bool operator==(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT;
-CONSTCD11
-    bool operator!=(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT;
-
-template<class = detail::unspecified_month_disambiguator>
-CONSTCD14
-year_month_weekday
-operator+(const year_month_weekday& ymwd, const months& dm) NOEXCEPT;
-
-template<class = detail::unspecified_month_disambiguator>
-CONSTCD14
-year_month_weekday
-operator+(const months& dm, const year_month_weekday& ymwd) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator+(const year_month_weekday& ymwd, const years& dy) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator+(const years& dy, const year_month_weekday& ymwd) NOEXCEPT;
-
-template<class = detail::unspecified_month_disambiguator>
-CONSTCD14
-year_month_weekday
-operator-(const year_month_weekday& ymwd, const months& dm) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator-(const year_month_weekday& ymwd, const years& dy) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_weekday& ymwdi);
-
-// year_month_weekday_last
-
-class year_month_weekday_last
-{
-    date::year y_;
-    date::month m_;
-    date::weekday_last wdl_;
-
-public:
-    CONSTCD11 year_month_weekday_last(const date::year& y, const date::month& m,
-                                      const date::weekday_last& wdl) NOEXCEPT;
-
-    template<class = detail::unspecified_month_disambiguator>
-    CONSTCD14 year_month_weekday_last& operator+=(const months& m) NOEXCEPT;
-    template<class = detail::unspecified_month_disambiguator>
-    CONSTCD14 year_month_weekday_last& operator-=(const months& m) NOEXCEPT;
-    CONSTCD14 year_month_weekday_last& operator+=(const years& y) NOEXCEPT;
-    CONSTCD14 year_month_weekday_last& operator-=(const years& y) NOEXCEPT;
-
-    CONSTCD11 date::year year() const NOEXCEPT;
-    CONSTCD11 date::month month() const NOEXCEPT;
-    CONSTCD11 date::weekday weekday() const NOEXCEPT;
-    CONSTCD11 date::weekday_last weekday_last() const NOEXCEPT;
-
-    CONSTCD14 operator sys_days() const NOEXCEPT;
-    CONSTCD14 explicit operator local_days() const NOEXCEPT;
-    CONSTCD11 bool ok() const NOEXCEPT;
-
-private:
-    CONSTCD14 days to_days() const NOEXCEPT;
-};
-
-CONSTCD11
-bool
-operator==(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT;
-
-CONSTCD11
-bool
-operator!=(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT;
-
-template<class = detail::unspecified_month_disambiguator>
-CONSTCD14
-year_month_weekday_last
-operator+(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT;
-
-template<class = detail::unspecified_month_disambiguator>
-CONSTCD14
-year_month_weekday_last
-operator+(const months& dm, const year_month_weekday_last& ymwdl) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator+(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator+(const years& dy, const year_month_weekday_last& ymwdl) NOEXCEPT;
-
-template<class = detail::unspecified_month_disambiguator>
-CONSTCD14
-year_month_weekday_last
-operator-(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator-(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_weekday_last& ymwdl);
-
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
-inline namespace literals
-{
-
-CONSTCD11 date::day  operator "" _d(unsigned long long d) NOEXCEPT;
-CONSTCD11 date::year operator "" _y(unsigned long long y) NOEXCEPT;
-
-}  // inline namespace literals
-#endif // !defined(_MSC_VER) || (_MSC_VER >= 1900)
-
-// CONSTDATA date::month January{1};
-// CONSTDATA date::month February{2};
-// CONSTDATA date::month March{3};
-// CONSTDATA date::month April{4};
-// CONSTDATA date::month May{5};
-// CONSTDATA date::month June{6};
-// CONSTDATA date::month July{7};
-// CONSTDATA date::month August{8};
-// CONSTDATA date::month September{9};
-// CONSTDATA date::month October{10};
-// CONSTDATA date::month November{11};
-// CONSTDATA date::month December{12};
-//
-// CONSTDATA date::weekday Sunday{0u};
-// CONSTDATA date::weekday Monday{1u};
-// CONSTDATA date::weekday Tuesday{2u};
-// CONSTDATA date::weekday Wednesday{3u};
-// CONSTDATA date::weekday Thursday{4u};
-// CONSTDATA date::weekday Friday{5u};
-// CONSTDATA date::weekday Saturday{6u};
-
-#if HAS_VOID_T
-
-template <class T, class = std::void_t<>>
-struct is_clock
-    : std::false_type
-{};
-
-template <class T>
-struct is_clock<T, std::void_t<decltype(T::now()), typename T::rep, typename T::period,
-                               typename T::duration, typename T::time_point,
-                               decltype(T::is_steady)>>
-    : std::true_type
-{};
-
-#endif  // HAS_VOID_T
-
-//----------------+
-// Implementation |
-//----------------+
-
-// utilities
-namespace detail {
-
-template<class CharT, class Traits = std::char_traits<CharT>>
-class save_istream
-{
-protected:
-    std::basic_ios<CharT, Traits>& is_;
-    CharT fill_;
-    std::ios::fmtflags flags_;
-    std::streamsize width_;
-    std::basic_ostream<CharT, Traits>* tie_;
-    std::locale loc_;
-
-public:
-    ~save_istream()
-    {
-        is_.fill(fill_);
-        is_.flags(flags_);
-        is_.width(width_);
-        is_.imbue(loc_);
-        is_.tie(tie_);
-    }
-
-    save_istream(const save_istream&) = delete;
-    save_istream& operator=(const save_istream&) = delete;
-
-    explicit save_istream(std::basic_ios<CharT, Traits>& is)
-        : is_(is)
-        , fill_(is.fill())
-        , flags_(is.flags())
-        , width_(is.width(0))
-        , tie_(is.tie(nullptr))
-        , loc_(is.getloc())
-        {
-            if (tie_ != nullptr)
-                tie_->flush();
-        }
-};
-
-template<class CharT, class Traits = std::char_traits<CharT>>
-class save_ostream
-    : private save_istream<CharT, Traits>
-{
-public:
-    ~save_ostream()
-    {
-        if ((this->flags_ & std::ios::unitbuf) &&
-#if HAS_UNCAUGHT_EXCEPTIONS
-                std::uncaught_exceptions() == 0 &&
-#else
-                !std::uncaught_exception() &&
-#endif
-                this->is_.good())
-            this->is_.rdbuf()->pubsync();
-    }
-
-    save_ostream(const save_ostream&) = delete;
-    save_ostream& operator=(const save_ostream&) = delete;
-
-    explicit save_ostream(std::basic_ios<CharT, Traits>& os)
-        : save_istream<CharT, Traits>(os)
-        {
-        }
-};
-
-template <class T>
-struct choose_trunc_type
-{
-    static const int digits = std::numeric_limits<T>::digits;
-    using type = typename std::conditional
-                 <
-                     digits < 32,
-                     std::int32_t,
-                     typename std::conditional
-                     <
-                         digits < 64,
-                         std::int64_t,
-#ifdef __SIZEOF_INT128__
-                         __int128
-#else
-                         std::int64_t
-#endif
-                     >::type
-                 >::type;
-};
-
-template <class T>
-CONSTCD11
-inline
-typename std::enable_if
-<
-    !std::chrono::treat_as_floating_point<T>::value,
-    T
->::type
-trunc(T t) NOEXCEPT
-{
-    return t;
-}
-
-template <class T>
-CONSTCD14
-inline
-typename std::enable_if
-<
-    std::chrono::treat_as_floating_point<T>::value,
-    T
->::type
-trunc(T t) NOEXCEPT
-{
-    using std::numeric_limits;
-    using I = typename choose_trunc_type<T>::type;
-    CONSTDATA auto digits = numeric_limits<T>::digits;
-    static_assert(digits < numeric_limits<I>::digits, "");
-    CONSTDATA auto max = I{1} << (digits-1);
-    CONSTDATA auto min = -max;
-    const auto negative = t < T{0};
-    if (min <= t && t <= max && t != 0 && t == t)
-    {
-        t = static_cast<T>(static_cast<I>(t));
-        if (t == 0 && negative)
-            t = -t;
-    }
-    return t;
-}
-
-template <std::intmax_t Xp, std::intmax_t Yp>
-struct static_gcd
-{
-    static const std::intmax_t value = static_gcd<Yp, Xp % Yp>::value;
-};
-
-template <std::intmax_t Xp>
-struct static_gcd<Xp, 0>
-{
-    static const std::intmax_t value = Xp;
-};
-
-template <>
-struct static_gcd<0, 0>
-{
-    static const std::intmax_t value = 1;
-};
-
-template <class R1, class R2>
-struct no_overflow
-{
-private:
-    static const std::intmax_t gcd_n1_n2 = static_gcd<R1::num, R2::num>::value;
-    static const std::intmax_t gcd_d1_d2 = static_gcd<R1::den, R2::den>::value;
-    static const std::intmax_t n1 = R1::num / gcd_n1_n2;
-    static const std::intmax_t d1 = R1::den / gcd_d1_d2;
-    static const std::intmax_t n2 = R2::num / gcd_n1_n2;
-    static const std::intmax_t d2 = R2::den / gcd_d1_d2;
-    static const std::intmax_t max = std::numeric_limits<std::intmax_t>::max();
-
-    template <std::intmax_t Xp, std::intmax_t Yp, bool overflow>
-    struct mul    // overflow == false
-    {
-        static const std::intmax_t value = Xp * Yp;
-    };
-
-    template <std::intmax_t Xp, std::intmax_t Yp>
-    struct mul<Xp, Yp, true>
-    {
-        static const std::intmax_t value = 1;
-    };
-
-public:
-    static const bool value = (n1 <= max / d2) && (n2 <= max / d1);
-    typedef std::ratio<mul<n1, d2, !value>::value,
-                       mul<n2, d1, !value>::value> type;
-};
-
-}  // detail
-
-// trunc towards zero
-template <class To, class Rep, class Period>
-CONSTCD11
-inline
-typename std::enable_if
-<
-    detail::no_overflow<Period, typename To::period>::value,
-    To
->::type
-trunc(const std::chrono::duration<Rep, Period>& d)
-{
-    return To{detail::trunc(std::chrono::duration_cast<To>(d).count())};
-}
-
-template <class To, class Rep, class Period>
-CONSTCD11
-inline
-typename std::enable_if
-<
-    !detail::no_overflow<Period, typename To::period>::value,
-    To
->::type
-trunc(const std::chrono::duration<Rep, Period>& d)
-{
-    using std::chrono::duration_cast;
-    using std::chrono::duration;
-    using rep = typename std::common_type<Rep, typename To::rep>::type;
-    return To{detail::trunc(duration_cast<To>(duration_cast<duration<rep>>(d)).count())};
-}
-
-#ifndef HAS_CHRONO_ROUNDING
-#  if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 190023918 || (_MSC_FULL_VER >= 190000000 && defined (__clang__)))
-#    define HAS_CHRONO_ROUNDING 1
-#  elif defined(__cpp_lib_chrono) && __cplusplus > 201402 && __cpp_lib_chrono >= 201510
-#    define HAS_CHRONO_ROUNDING 1
-#  elif defined(_LIBCPP_VERSION) && __cplusplus > 201402 && _LIBCPP_VERSION >= 3800
-#    define HAS_CHRONO_ROUNDING 1
-#  else
-#    define HAS_CHRONO_ROUNDING 0
-#  endif
-#endif  // HAS_CHRONO_ROUNDING
-
-#if HAS_CHRONO_ROUNDING == 0
-
-// round down
-template <class To, class Rep, class Period>
-CONSTCD14
-inline
-typename std::enable_if
-<
-    detail::no_overflow<Period, typename To::period>::value,
-    To
->::type
-floor(const std::chrono::duration<Rep, Period>& d)
-{
-    auto t = trunc<To>(d);
-    if (t > d)
-        return t - To{1};
-    return t;
-}
-
-template <class To, class Rep, class Period>
-CONSTCD14
-inline
-typename std::enable_if
-<
-    !detail::no_overflow<Period, typename To::period>::value,
-    To
->::type
-floor(const std::chrono::duration<Rep, Period>& d)
-{
-    using rep = typename std::common_type<Rep, typename To::rep>::type;
-    return floor<To>(floor<std::chrono::duration<rep>>(d));
-}
-
-// round to nearest, to even on tie
-template <class To, class Rep, class Period>
-CONSTCD14
-inline
-To
-round(const std::chrono::duration<Rep, Period>& d)
-{
-    auto t0 = floor<To>(d);
-    auto t1 = t0 + To{1};
-    if (t1 == To{0} && t0 < To{0})
-        t1 = -t1;
-    auto diff0 = d - t0;
-    auto diff1 = t1 - d;
-    if (diff0 == diff1)
-    {
-        if (t0 - trunc<To>(t0/2)*2 == To{0})
-            return t0;
-        return t1;
-    }
-    if (diff0 < diff1)
-        return t0;
-    return t1;
-}
-
-// round up
-template <class To, class Rep, class Period>
-CONSTCD14
-inline
-To
-ceil(const std::chrono::duration<Rep, Period>& d)
-{
-    auto t = trunc<To>(d);
-    if (t < d)
-        return t + To{1};
-    return t;
-}
-
-template <class Rep, class Period,
-          class = typename std::enable_if
-          <
-              std::numeric_limits<Rep>::is_signed
-          >::type>
-CONSTCD11
-std::chrono::duration<Rep, Period>
-abs(std::chrono::duration<Rep, Period> d)
-{
-    return d >= d.zero() ? d : -d;
-}
-
-// round down
-template <class To, class Clock, class FromDuration>
-CONSTCD11
-inline
-std::chrono::time_point<Clock, To>
-floor(const std::chrono::time_point<Clock, FromDuration>& tp)
-{
-    using std::chrono::time_point;
-    return time_point<Clock, To>{date::floor<To>(tp.time_since_epoch())};
-}
-
-// round to nearest, to even on tie
-template <class To, class Clock, class FromDuration>
-CONSTCD11
-inline
-std::chrono::time_point<Clock, To>
-round(const std::chrono::time_point<Clock, FromDuration>& tp)
-{
-    using std::chrono::time_point;
-    return time_point<Clock, To>{round<To>(tp.time_since_epoch())};
-}
-
-// round up
-template <class To, class Clock, class FromDuration>
-CONSTCD11
-inline
-std::chrono::time_point<Clock, To>
-ceil(const std::chrono::time_point<Clock, FromDuration>& tp)
-{
-    using std::chrono::time_point;
-    return time_point<Clock, To>{ceil<To>(tp.time_since_epoch())};
-}
-
-#else  // HAS_CHRONO_ROUNDING == 1
-
-using std::chrono::floor;
-using std::chrono::ceil;
-using std::chrono::round;
-using std::chrono::abs;
-
-#endif  // HAS_CHRONO_ROUNDING
-
-// trunc towards zero
-template <class To, class Clock, class FromDuration>
-CONSTCD11
-inline
-std::chrono::time_point<Clock, To>
-trunc(const std::chrono::time_point<Clock, FromDuration>& tp)
-{
-    using std::chrono::time_point;
-    return time_point<Clock, To>{trunc<To>(tp.time_since_epoch())};
-}
-
-// day
-
-CONSTCD11 inline day::day(unsigned d) NOEXCEPT : d_(static_cast<decltype(d_)>(d)) {}
-CONSTCD14 inline day& day::operator++() NOEXCEPT {++d_; return *this;}
-CONSTCD14 inline day day::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;}
-CONSTCD14 inline day& day::operator--() NOEXCEPT {--d_; return *this;}
-CONSTCD14 inline day day::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;}
-CONSTCD14 inline day& day::operator+=(const days& d) NOEXCEPT {*this = *this + d; return *this;}
-CONSTCD14 inline day& day::operator-=(const days& d) NOEXCEPT {*this = *this - d; return *this;}
-CONSTCD11 inline day::operator unsigned() const NOEXCEPT {return d_;}
-CONSTCD11 inline bool day::ok() const NOEXCEPT {return 1 <= d_ && d_ <= 31;}
-
-CONSTCD11
-inline
-bool
-operator==(const day& x, const day& y) NOEXCEPT
-{
-    return static_cast<unsigned>(x) == static_cast<unsigned>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const day& x, const day& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const day& x, const day& y) NOEXCEPT
-{
-    return static_cast<unsigned>(x) < static_cast<unsigned>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator>(const day& x, const day& y) NOEXCEPT
-{
-    return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const day& x, const day& y) NOEXCEPT
-{
-    return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const day& x, const day& y) NOEXCEPT
-{
-    return !(x < y);
-}
-
-CONSTCD11
-inline
-days
-operator-(const day& x, const day& y) NOEXCEPT
-{
-    return days{static_cast<days::rep>(static_cast<unsigned>(x)
-                                     - static_cast<unsigned>(y))};
-}
-
-CONSTCD11
-inline
-day
-operator+(const day& x, const days& y) NOEXCEPT
-{
-    return day{static_cast<unsigned>(x) + static_cast<unsigned>(y.count())};
-}
-
-CONSTCD11
-inline
-day
-operator+(const days& x, const day& y) NOEXCEPT
-{
-    return y + x;
-}
-
-CONSTCD11
-inline
-day
-operator-(const day& x, const days& y) NOEXCEPT
-{
-    return x + -y;
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const day& d)
-{
-    detail::save_ostream<CharT, Traits> _(os);
-    os.fill('0');
-    os.flags(std::ios::dec | std::ios::right);
-    os.width(2);
-    os << static_cast<unsigned>(d);
-    if (!d.ok())
-        os << " is not a valid day";
-    return os;
-}
-
-// month
-
-CONSTCD11 inline month::month(unsigned m) NOEXCEPT : m_(static_cast<decltype(m_)>(m)) {}
-CONSTCD14 inline month& month::operator++() NOEXCEPT {*this += months{1}; return *this;}
-CONSTCD14 inline month month::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;}
-CONSTCD14 inline month& month::operator--() NOEXCEPT {*this -= months{1}; return *this;}
-CONSTCD14 inline month month::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;}
-
-CONSTCD14
-inline
-month&
-month::operator+=(const months& m) NOEXCEPT
-{
-    *this = *this + m;
-    return *this;
-}
-
-CONSTCD14
-inline
-month&
-month::operator-=(const months& m) NOEXCEPT
-{
-    *this = *this - m;
-    return *this;
-}
-
-CONSTCD11 inline month::operator unsigned() const NOEXCEPT {return m_;}
-CONSTCD11 inline bool month::ok() const NOEXCEPT {return 1 <= m_ && m_ <= 12;}
-
-CONSTCD11
-inline
-bool
-operator==(const month& x, const month& y) NOEXCEPT
-{
-    return static_cast<unsigned>(x) == static_cast<unsigned>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const month& x, const month& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const month& x, const month& y) NOEXCEPT
-{
-    return static_cast<unsigned>(x) < static_cast<unsigned>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator>(const month& x, const month& y) NOEXCEPT
-{
-    return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const month& x, const month& y) NOEXCEPT
-{
-    return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const month& x, const month& y) NOEXCEPT
-{
-    return !(x < y);
-}
-
-CONSTCD14
-inline
-months
-operator-(const month& x, const month& y) NOEXCEPT
-{
-    auto const d = static_cast<unsigned>(x) - static_cast<unsigned>(y);
-    return months(d <= 11 ? d : d + 12);
-}
-
-CONSTCD14
-inline
-month
-operator+(const month& x, const months& y) NOEXCEPT
-{
-    auto const mu = static_cast<long long>(static_cast<unsigned>(x)) + (y.count() - 1);
-    auto const yr = (mu >= 0 ? mu : mu-11) / 12;
-    return month{static_cast<unsigned>(mu - yr * 12 + 1)};
-}
-
-CONSTCD14
-inline
-month
-operator+(const months& x, const month& y) NOEXCEPT
-{
-    return y + x;
-}
-
-CONSTCD14
-inline
-month
-operator-(const month& x, const months& y) NOEXCEPT
-{
-    return x + -y;
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month& m)
-{
-    if (m.ok())
-    {
-        CharT fmt[] = {'%', 'b', 0};
-        os << format(os.getloc(), fmt, m);
-    }
-    else
-        os << static_cast<unsigned>(m) << " is not a valid month";
-    return os;
-}
-
-// year
-
-CONSTCD11 inline year::year(int y) NOEXCEPT : y_(static_cast<decltype(y_)>(y)) {}
-CONSTCD14 inline year& year::operator++() NOEXCEPT {++y_; return *this;}
-CONSTCD14 inline year year::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;}
-CONSTCD14 inline year& year::operator--() NOEXCEPT {--y_; return *this;}
-CONSTCD14 inline year year::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;}
-CONSTCD14 inline year& year::operator+=(const years& y) NOEXCEPT {*this = *this + y; return *this;}
-CONSTCD14 inline year& year::operator-=(const years& y) NOEXCEPT {*this = *this - y; return *this;}
-CONSTCD11 inline year year::operator-() const NOEXCEPT {return year{-y_};}
-CONSTCD11 inline year year::operator+() const NOEXCEPT {return *this;}
-
-CONSTCD11
-inline
-bool
-year::is_leap() const NOEXCEPT
-{
-    return y_ % 4 == 0 && (y_ % 100 != 0 || y_ % 400 == 0);
-}
-
-CONSTCD11 inline year::operator int() const NOEXCEPT {return y_;}
-
-CONSTCD11
-inline
-bool
-year::ok() const NOEXCEPT
-{
-    return y_ != std::numeric_limits<short>::min();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year& x, const year& y) NOEXCEPT
-{
-    return static_cast<int>(x) == static_cast<int>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year& x, const year& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const year& x, const year& y) NOEXCEPT
-{
-    return static_cast<int>(x) < static_cast<int>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator>(const year& x, const year& y) NOEXCEPT
-{
-    return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const year& x, const year& y) NOEXCEPT
-{
-    return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const year& x, const year& y) NOEXCEPT
-{
-    return !(x < y);
-}
-
-CONSTCD11
-inline
-years
-operator-(const year& x, const year& y) NOEXCEPT
-{
-    return years{static_cast<int>(x) - static_cast<int>(y)};
-}
-
-CONSTCD11
-inline
-year
-operator+(const year& x, const years& y) NOEXCEPT
-{
-    return year{static_cast<int>(x) + y.count()};
-}
-
-CONSTCD11
-inline
-year
-operator+(const years& x, const year& y) NOEXCEPT
-{
-    return y + x;
-}
-
-CONSTCD11
-inline
-year
-operator-(const year& x, const years& y) NOEXCEPT
-{
-    return year{static_cast<int>(x) - y.count()};
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year& y)
-{
-    detail::save_ostream<CharT, Traits> _(os);
-    os.fill('0');
-    os.flags(std::ios::dec | std::ios::internal);
-    os.width(4 + (y < year{0}));
-    os.imbue(std::locale::classic());
-    os << static_cast<int>(y);
-    if (!y.ok())
-        os << " is not a valid year";
-    return os;
-}
-
-// weekday
-
-CONSTCD14
-inline
-unsigned char
-weekday::weekday_from_days(int z) NOEXCEPT
-{
-    auto u = static_cast<unsigned>(z);
-    return static_cast<unsigned char>(z >= -4 ? (u+4) % 7 : u % 7);
-}
-
-CONSTCD11
-inline
-weekday::weekday(unsigned wd) NOEXCEPT
-    : wd_(static_cast<decltype(wd_)>(wd != 7 ? wd : 0))
-    {}
-
-CONSTCD14
-inline
-weekday::weekday(const sys_days& dp) NOEXCEPT
-    : wd_(weekday_from_days(dp.time_since_epoch().count()))
-    {}
-
-CONSTCD14
-inline
-weekday::weekday(const local_days& dp) NOEXCEPT
-    : wd_(weekday_from_days(dp.time_since_epoch().count()))
-    {}
-
-CONSTCD14 inline weekday& weekday::operator++() NOEXCEPT {*this += days{1}; return *this;}
-CONSTCD14 inline weekday weekday::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;}
-CONSTCD14 inline weekday& weekday::operator--() NOEXCEPT {*this -= days{1}; return *this;}
-CONSTCD14 inline weekday weekday::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;}
-
-CONSTCD14
-inline
-weekday&
-weekday::operator+=(const days& d) NOEXCEPT
-{
-    *this = *this + d;
-    return *this;
-}
-
-CONSTCD14
-inline
-weekday&
-weekday::operator-=(const days& d) NOEXCEPT
-{
-    *this = *this - d;
-    return *this;
-}
-
-CONSTCD11 inline bool weekday::ok() const NOEXCEPT {return wd_ <= 6;}
-
-CONSTCD11
-inline
-unsigned weekday::c_encoding() const NOEXCEPT
-{
-    return unsigned{wd_};
-}
-
-CONSTCD11
-inline
-unsigned weekday::iso_encoding() const NOEXCEPT
-{
-    return unsigned{((wd_ == 0u) ? 7u : wd_)};
-}
-
-CONSTCD11
-inline
-bool
-operator==(const weekday& x, const weekday& y) NOEXCEPT
-{
-    return x.wd_ == y.wd_;
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const weekday& x, const weekday& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-CONSTCD14
-inline
-days
-operator-(const weekday& x, const weekday& y) NOEXCEPT
-{
-    auto const wdu = x.wd_ - y.wd_;
-    auto const wk = (wdu >= 0 ? wdu : wdu-6) / 7;
-    return days{wdu - wk * 7};
-}
-
-CONSTCD14
-inline
-weekday
-operator+(const weekday& x, const days& y) NOEXCEPT
-{
-    auto const wdu = static_cast<long long>(static_cast<unsigned>(x.wd_)) + y.count();
-    auto const wk = (wdu >= 0 ? wdu : wdu-6) / 7;
-    return weekday{static_cast<unsigned>(wdu - wk * 7)};
-}
-
-CONSTCD14
-inline
-weekday
-operator+(const days& x, const weekday& y) NOEXCEPT
-{
-    return y + x;
-}
-
-CONSTCD14
-inline
-weekday
-operator-(const weekday& x, const days& y) NOEXCEPT
-{
-    return x + -y;
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday& wd)
-{
-    if (wd.ok())
-    {
-        CharT fmt[] = {'%', 'a', 0};
-        os << format(fmt, wd);
-    }
-    else
-        os << static_cast<unsigned>(wd.wd_) << " is not a valid weekday";
-    return os;
-}
-
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
-inline namespace literals
-{
-
-CONSTCD11
-inline
-date::day
-operator "" _d(unsigned long long d) NOEXCEPT
-{
-    return date::day{static_cast<unsigned>(d)};
-}
-
-CONSTCD11
-inline
-date::year
-operator "" _y(unsigned long long y) NOEXCEPT
-{
-    return date::year(static_cast<int>(y));
-}
-#endif  // !defined(_MSC_VER) || (_MSC_VER >= 1900)
-
-CONSTDATA date::last_spec last{};
-
-CONSTDATA date::month jan{1};
-CONSTDATA date::month feb{2};
-CONSTDATA date::month mar{3};
-CONSTDATA date::month apr{4};
-CONSTDATA date::month may{5};
-CONSTDATA date::month jun{6};
-CONSTDATA date::month jul{7};
-CONSTDATA date::month aug{8};
-CONSTDATA date::month sep{9};
-CONSTDATA date::month oct{10};
-CONSTDATA date::month nov{11};
-CONSTDATA date::month dec{12};
-
-CONSTDATA date::weekday sun{0u};
-CONSTDATA date::weekday mon{1u};
-CONSTDATA date::weekday tue{2u};
-CONSTDATA date::weekday wed{3u};
-CONSTDATA date::weekday thu{4u};
-CONSTDATA date::weekday fri{5u};
-CONSTDATA date::weekday sat{6u};
-
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
-}  // inline namespace literals
-#endif
-
-CONSTDATA date::month January{1};
-CONSTDATA date::month February{2};
-CONSTDATA date::month March{3};
-CONSTDATA date::month April{4};
-CONSTDATA date::month May{5};
-CONSTDATA date::month June{6};
-CONSTDATA date::month July{7};
-CONSTDATA date::month August{8};
-CONSTDATA date::month September{9};
-CONSTDATA date::month October{10};
-CONSTDATA date::month November{11};
-CONSTDATA date::month December{12};
-
-CONSTDATA date::weekday Monday{1};
-CONSTDATA date::weekday Tuesday{2};
-CONSTDATA date::weekday Wednesday{3};
-CONSTDATA date::weekday Thursday{4};
-CONSTDATA date::weekday Friday{5};
-CONSTDATA date::weekday Saturday{6};
-CONSTDATA date::weekday Sunday{7};
-
-// weekday_indexed
-
-CONSTCD11
-inline
-weekday
-weekday_indexed::weekday() const NOEXCEPT
-{
-    return date::weekday{static_cast<unsigned>(wd_)};
-}
-
-CONSTCD11 inline unsigned weekday_indexed::index() const NOEXCEPT {return index_;}
-
-CONSTCD11
-inline
-bool
-weekday_indexed::ok() const NOEXCEPT
-{
-    return weekday().ok() && 1 <= index_ && index_ <= 5;
-}
-
-#ifdef __GNUC__
-#  pragma GCC diagnostic push
-#  pragma GCC diagnostic ignored "-Wconversion"
-#endif  // __GNUC__
-
-CONSTCD11
-inline
-weekday_indexed::weekday_indexed(const date::weekday& wd, unsigned index) NOEXCEPT
-    : wd_(static_cast<decltype(wd_)>(static_cast<unsigned>(wd.wd_)))
-    , index_(static_cast<decltype(index_)>(index))
-    {}
-
-#ifdef __GNUC__
-#  pragma GCC diagnostic pop
-#endif  // __GNUC__
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday_indexed& wdi)
-{
-    os << wdi.weekday() << '[' << wdi.index();
-    if (!(1 <= wdi.index() && wdi.index() <= 5))
-        os << " is not a valid index";
-    os << ']';
-    return os;
-}
-
-CONSTCD11
-inline
-weekday_indexed
-weekday::operator[](unsigned index) const NOEXCEPT
-{
-    return {*this, index};
-}
-
-CONSTCD11
-inline
-bool
-operator==(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT
-{
-    return x.weekday() == y.weekday() && x.index() == y.index();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-// weekday_last
-
-CONSTCD11 inline date::weekday weekday_last::weekday() const NOEXCEPT {return wd_;}
-CONSTCD11 inline bool weekday_last::ok() const NOEXCEPT {return wd_.ok();}
-CONSTCD11 inline weekday_last::weekday_last(const date::weekday& wd) NOEXCEPT : wd_(wd) {}
-
-CONSTCD11
-inline
-bool
-operator==(const weekday_last& x, const weekday_last& y) NOEXCEPT
-{
-    return x.weekday() == y.weekday();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const weekday_last& x, const weekday_last& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday_last& wdl)
-{
-    return os << wdl.weekday() << "[last]";
-}
-
-CONSTCD11
-inline
-weekday_last
-weekday::operator[](last_spec) const NOEXCEPT
-{
-    return weekday_last{*this};
-}
-
-// year_month
-
-CONSTCD11
-inline
-year_month::year_month(const date::year& y, const date::month& m) NOEXCEPT
-    : y_(y)
-    , m_(m)
-    {}
-
-CONSTCD11 inline year year_month::year() const NOEXCEPT {return y_;}
-CONSTCD11 inline month year_month::month() const NOEXCEPT {return m_;}
-CONSTCD11 inline bool year_month::ok() const NOEXCEPT {return y_.ok() && m_.ok();}
-
-template<class>
-CONSTCD14
-inline
-year_month&
-year_month::operator+=(const months& dm) NOEXCEPT
-{
-    *this = *this + dm;
-    return *this;
-}
-
-template<class>
-CONSTCD14
-inline
-year_month&
-year_month::operator-=(const months& dm) NOEXCEPT
-{
-    *this = *this - dm;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month&
-year_month::operator+=(const years& dy) NOEXCEPT
-{
-    *this = *this + dy;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month&
-year_month::operator-=(const years& dy) NOEXCEPT
-{
-    *this = *this - dy;
-    return *this;
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year_month& x, const year_month& y) NOEXCEPT
-{
-    return x.year() == y.year() && x.month() == y.month();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year_month& x, const year_month& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const year_month& x, const year_month& y) NOEXCEPT
-{
-    return x.year() < y.year() ? true
-        : (x.year() > y.year() ? false
-        : (x.month() < y.month()));
-}
-
-CONSTCD11
-inline
-bool
-operator>(const year_month& x, const year_month& y) NOEXCEPT
-{
-    return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const year_month& x, const year_month& y) NOEXCEPT
-{
-    return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const year_month& x, const year_month& y) NOEXCEPT
-{
-    return !(x < y);
-}
-
-template<class>
-CONSTCD14
-inline
-year_month
-operator+(const year_month& ym, const months& dm) NOEXCEPT
-{
-    auto dmi = static_cast<int>(static_cast<unsigned>(ym.month())) - 1 + dm.count();
-    auto dy = (dmi >= 0 ? dmi : dmi-11) / 12;
-    dmi = dmi - dy * 12 + 1;
-    return (ym.year() + years(dy)) / month(static_cast<unsigned>(dmi));
-}
-
-template<class>
-CONSTCD14
-inline
-year_month
-operator+(const months& dm, const year_month& ym) NOEXCEPT
-{
-    return ym + dm;
-}
-
-template<class>
-CONSTCD14
-inline
-year_month
-operator-(const year_month& ym, const months& dm) NOEXCEPT
-{
-    return ym + -dm;
-}
-
-CONSTCD11
-inline
-months
-operator-(const year_month& x, const year_month& y) NOEXCEPT
-{
-    return (x.year() - y.year()) +
-            months(static_cast<unsigned>(x.month()) - static_cast<unsigned>(y.month()));
-}
-
-CONSTCD11
-inline
-year_month
-operator+(const year_month& ym, const years& dy) NOEXCEPT
-{
-    return (ym.year() + dy) / ym.month();
-}
-
-CONSTCD11
-inline
-year_month
-operator+(const years& dy, const year_month& ym) NOEXCEPT
-{
-    return ym + dy;
-}
-
-CONSTCD11
-inline
-year_month
-operator-(const year_month& ym, const years& dy) NOEXCEPT
-{
-    return ym + -dy;
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month& ym)
-{
-    return os << ym.year() << '/' << ym.month();
-}
-
-// month_day
-
-CONSTCD11
-inline
-month_day::month_day(const date::month& m, const date::day& d) NOEXCEPT
-    : m_(m)
-    , d_(d)
-    {}
-
-CONSTCD11 inline date::month month_day::month() const NOEXCEPT {return m_;}
-CONSTCD11 inline date::day month_day::day() const NOEXCEPT {return d_;}
-
-CONSTCD14
-inline
-bool
-month_day::ok() const NOEXCEPT
-{
-    CONSTDATA date::day d[] =
-    {
-        date::day(31), date::day(29), date::day(31),
-        date::day(30), date::day(31), date::day(30),
-        date::day(31), date::day(31), date::day(30),
-        date::day(31), date::day(30), date::day(31)
-    };
-    return m_.ok() && date::day{1} <= d_ && d_ <= d[static_cast<unsigned>(m_)-1];
-}
-
-CONSTCD11
-inline
-bool
-operator==(const month_day& x, const month_day& y) NOEXCEPT
-{
-    return x.month() == y.month() && x.day() == y.day();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const month_day& x, const month_day& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const month_day& x, const month_day& y) NOEXCEPT
-{
-    return x.month() < y.month() ? true
-        : (x.month() > y.month() ? false
-        : (x.day() < y.day()));
-}
-
-CONSTCD11
-inline
-bool
-operator>(const month_day& x, const month_day& y) NOEXCEPT
-{
-    return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const month_day& x, const month_day& y) NOEXCEPT
-{
-    return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const month_day& x, const month_day& y) NOEXCEPT
-{
-    return !(x < y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_day& md)
-{
-    return os << md.month() << '/' << md.day();
-}
-
-// month_day_last
-
-CONSTCD11 inline month month_day_last::month() const NOEXCEPT {return m_;}
-CONSTCD11 inline bool month_day_last::ok() const NOEXCEPT {return m_.ok();}
-CONSTCD11 inline month_day_last::month_day_last(const date::month& m) NOEXCEPT : m_(m) {}
-
-CONSTCD11
-inline
-bool
-operator==(const month_day_last& x, const month_day_last& y) NOEXCEPT
-{
-    return x.month() == y.month();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const month_day_last& x, const month_day_last& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const month_day_last& x, const month_day_last& y) NOEXCEPT
-{
-    return x.month() < y.month();
-}
-
-CONSTCD11
-inline
-bool
-operator>(const month_day_last& x, const month_day_last& y) NOEXCEPT
-{
-    return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const month_day_last& x, const month_day_last& y) NOEXCEPT
-{
-    return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const month_day_last& x, const month_day_last& y) NOEXCEPT
-{
-    return !(x < y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_day_last& mdl)
-{
-    return os << mdl.month() << "/last";
-}
-
-// month_weekday
-
-CONSTCD11
-inline
-month_weekday::month_weekday(const date::month& m,
-                             const date::weekday_indexed& wdi) NOEXCEPT
-    : m_(m)
-    , wdi_(wdi)
-    {}
-
-CONSTCD11 inline month month_weekday::month() const NOEXCEPT {return m_;}
-
-CONSTCD11
-inline
-weekday_indexed
-month_weekday::weekday_indexed() const NOEXCEPT
-{
-    return wdi_;
-}
-
-CONSTCD11
-inline
-bool
-month_weekday::ok() const NOEXCEPT
-{
-    return m_.ok() && wdi_.ok();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const month_weekday& x, const month_weekday& y) NOEXCEPT
-{
-    return x.month() == y.month() && x.weekday_indexed() == y.weekday_indexed();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const month_weekday& x, const month_weekday& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_weekday& mwd)
-{
-    return os << mwd.month() << '/' << mwd.weekday_indexed();
-}
-
-// month_weekday_last
-
-CONSTCD11
-inline
-month_weekday_last::month_weekday_last(const date::month& m,
-                                       const date::weekday_last& wdl) NOEXCEPT
-    : m_(m)
-    , wdl_(wdl)
-    {}
-
-CONSTCD11 inline month month_weekday_last::month() const NOEXCEPT {return m_;}
-
-CONSTCD11
-inline
-weekday_last
-month_weekday_last::weekday_last() const NOEXCEPT
-{
-    return wdl_;
-}
-
-CONSTCD11
-inline
-bool
-month_weekday_last::ok() const NOEXCEPT
-{
-    return m_.ok() && wdl_.ok();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT
-{
-    return x.month() == y.month() && x.weekday_last() == y.weekday_last();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_weekday_last& mwdl)
-{
-    return os << mwdl.month() << '/' << mwdl.weekday_last();
-}
-
-// year_month_day_last
-
-CONSTCD11
-inline
-year_month_day_last::year_month_day_last(const date::year& y,
-                                         const date::month_day_last& mdl) NOEXCEPT
-    : y_(y)
-    , mdl_(mdl)
-    {}
-
-template<class>
-CONSTCD14
-inline
-year_month_day_last&
-year_month_day_last::operator+=(const months& m) NOEXCEPT
-{
-    *this = *this + m;
-    return *this;
-}
-
-template<class>
-CONSTCD14
-inline
-year_month_day_last&
-year_month_day_last::operator-=(const months& m) NOEXCEPT
-{
-    *this = *this - m;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month_day_last&
-year_month_day_last::operator+=(const years& y) NOEXCEPT
-{
-    *this = *this + y;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month_day_last&
-year_month_day_last::operator-=(const years& y) NOEXCEPT
-{
-    *this = *this - y;
-    return *this;
-}
-
-CONSTCD11 inline year year_month_day_last::year() const NOEXCEPT {return y_;}
-CONSTCD11 inline month year_month_day_last::month() const NOEXCEPT {return mdl_.month();}
-
-CONSTCD11
-inline
-month_day_last
-year_month_day_last::month_day_last() const NOEXCEPT
-{
-    return mdl_;
-}
-
-CONSTCD14
-inline
-day
-year_month_day_last::day() const NOEXCEPT
-{
-    CONSTDATA date::day d[] =
-    {
-        date::day(31), date::day(28), date::day(31),
-        date::day(30), date::day(31), date::day(30),
-        date::day(31), date::day(31), date::day(30),
-        date::day(31), date::day(30), date::day(31)
-    };
-    return (month() != February || !y_.is_leap()) && mdl_.ok() ?
-        d[static_cast<unsigned>(month()) - 1] : date::day{29};
-}
-
-CONSTCD14
-inline
-year_month_day_last::operator sys_days() const NOEXCEPT
-{
-    return sys_days(year()/month()/day());
-}
-
-CONSTCD14
-inline
-year_month_day_last::operator local_days() const NOEXCEPT
-{
-    return local_days(year()/month()/day());
-}
-
-CONSTCD11
-inline
-bool
-year_month_day_last::ok() const NOEXCEPT
-{
-    return y_.ok() && mdl_.ok();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT
-{
-    return x.year() == y.year() && x.month_day_last() == y.month_day_last();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT
-{
-    return x.year() < y.year() ? true
-        : (x.year() > y.year() ? false
-        : (x.month_day_last() < y.month_day_last()));
-}
-
-CONSTCD11
-inline
-bool
-operator>(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT
-{
-    return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT
-{
-    return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT
-{
-    return !(x < y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_day_last& ymdl)
-{
-    return os << ymdl.year() << '/' << ymdl.month_day_last();
-}
-
-template<class>
-CONSTCD14
-inline
-year_month_day_last
-operator+(const year_month_day_last& ymdl, const months& dm) NOEXCEPT
-{
-    return (ymdl.year() / ymdl.month() + dm) / last;
-}
-
-template<class>
-CONSTCD14
-inline
-year_month_day_last
-operator+(const months& dm, const year_month_day_last& ymdl) NOEXCEPT
-{
-    return ymdl + dm;
-}
-
-template<class>
-CONSTCD14
-inline
-year_month_day_last
-operator-(const year_month_day_last& ymdl, const months& dm) NOEXCEPT
-{
-    return ymdl + (-dm);
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator+(const year_month_day_last& ymdl, const years& dy) NOEXCEPT
-{
-    return {ymdl.year()+dy, ymdl.month_day_last()};
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator+(const years& dy, const year_month_day_last& ymdl) NOEXCEPT
-{
-    return ymdl + dy;
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator-(const year_month_day_last& ymdl, const years& dy) NOEXCEPT
-{
-    return ymdl + (-dy);
-}
-
-// year_month_day
-
-CONSTCD11
-inline
-year_month_day::year_month_day(const date::year& y, const date::month& m,
-                               const date::day& d) NOEXCEPT
-    : y_(y)
-    , m_(m)
-    , d_(d)
-    {}
-
-CONSTCD14
-inline
-year_month_day::year_month_day(const year_month_day_last& ymdl) NOEXCEPT
-    : y_(ymdl.year())
-    , m_(ymdl.month())
-    , d_(ymdl.day())
-    {}
-
-CONSTCD14
-inline
-year_month_day::year_month_day(sys_days dp) NOEXCEPT
-    : year_month_day(from_days(dp.time_since_epoch()))
-    {}
-
-CONSTCD14
-inline
-year_month_day::year_month_day(local_days dp) NOEXCEPT
-    : year_month_day(from_days(dp.time_since_epoch()))
-    {}
-
-CONSTCD11 inline year year_month_day::year() const NOEXCEPT {return y_;}
-CONSTCD11 inline month year_month_day::month() const NOEXCEPT {return m_;}
-CONSTCD11 inline day year_month_day::day() const NOEXCEPT {return d_;}
-
-template<class>
-CONSTCD14
-inline
-year_month_day&
-year_month_day::operator+=(const months& m) NOEXCEPT
-{
-    *this = *this + m;
-    return *this;
-}
-
-template<class>
-CONSTCD14
-inline
-year_month_day&
-year_month_day::operator-=(const months& m) NOEXCEPT
-{
-    *this = *this - m;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month_day&
-year_month_day::operator+=(const years& y) NOEXCEPT
-{
-    *this = *this + y;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month_day&
-year_month_day::operator-=(const years& y) NOEXCEPT
-{
-    *this = *this - y;
-    return *this;
-}
-
-CONSTCD14
-inline
-days
-year_month_day::to_days() const NOEXCEPT
-{
-    static_assert(std::numeric_limits<unsigned>::digits >= 18,
-             "This algorithm has not been ported to a 16 bit unsigned integer");
-    static_assert(std::numeric_limits<int>::digits >= 20,
-             "This algorithm has not been ported to a 16 bit signed integer");
-    auto const y = static_cast<int>(y_) - (m_ <= February);
-    auto const m = static_cast<unsigned>(m_);
-    auto const d = static_cast<unsigned>(d_);
-    auto const era = (y >= 0 ? y : y-399) / 400;
-    auto const yoe = static_cast<unsigned>(y - era * 400);       // [0, 399]
-    auto const doy = (153*(m > 2 ? m-3 : m+9) + 2)/5 + d-1;      // [0, 365]
-    auto const doe = yoe * 365 + yoe/4 - yoe/100 + doy;          // [0, 146096]
-    return days{era * 146097 + static_cast<int>(doe) - 719468};
-}
-
-CONSTCD14
-inline
-year_month_day::operator sys_days() const NOEXCEPT
-{
-    return sys_days{to_days()};
-}
-
-CONSTCD14
-inline
-year_month_day::operator local_days() const NOEXCEPT
-{
-    return local_days{to_days()};
-}
-
-CONSTCD14
-inline
-bool
-year_month_day::ok() const NOEXCEPT
-{
-    if (!(y_.ok() && m_.ok()))
-        return false;
-    return date::day{1} <= d_ && d_ <= (y_ / m_ / last).day();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year_month_day& x, const year_month_day& y) NOEXCEPT
-{
-    return x.year() == y.year() && x.month() == y.month() && x.day() == y.day();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year_month_day& x, const year_month_day& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const year_month_day& x, const year_month_day& y) NOEXCEPT
-{
-    return x.year() < y.year() ? true
-        : (x.year() > y.year() ? false
-        : (x.month() < y.month() ? true
-        : (x.month() > y.month() ? false
-        : (x.day() < y.day()))));
-}
-
-CONSTCD11
-inline
-bool
-operator>(const year_month_day& x, const year_month_day& y) NOEXCEPT
-{
-    return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const year_month_day& x, const year_month_day& y) NOEXCEPT
-{
-    return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const year_month_day& x, const year_month_day& y) NOEXCEPT
-{
-    return !(x < y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_day& ymd)
-{
-    detail::save_ostream<CharT, Traits> _(os);
-    os.fill('0');
-    os.flags(std::ios::dec | std::ios::right);
-    os.imbue(std::locale::classic());
-    os << ymd.year() << '-';
-    os.width(2);
-    os << static_cast<unsigned>(ymd.month()) << '-';
-    os << ymd.day();
-    if (!ymd.ok())
-        os << " is not a valid date";
-    return os;
-}
-
-CONSTCD14
-inline
-year_month_day
-year_month_day::from_days(days dp) NOEXCEPT
-{
-    static_assert(std::numeric_limits<unsigned>::digits >= 18,
-             "This algorithm has not been ported to a 16 bit unsigned integer");
-    static_assert(std::numeric_limits<int>::digits >= 20,
-             "This algorithm has not been ported to a 16 bit signed integer");
-    auto const z = dp.count() + 719468;
-    auto const era = (z >= 0 ? z : z - 146096) / 146097;
-    auto const doe = static_cast<unsigned>(z - era * 146097);          // [0, 146096]
-    auto const yoe = (doe - doe/1460 + doe/36524 - doe/146096) / 365;  // [0, 399]
-    auto const y = static_cast<days::rep>(yoe) + era * 400;
-    auto const doy = doe - (365*yoe + yoe/4 - yoe/100);                // [0, 365]
-    auto const mp = (5*doy + 2)/153;                                   // [0, 11]
-    auto const d = doy - (153*mp+2)/5 + 1;                             // [1, 31]
-    auto const m = mp < 10 ? mp+3 : mp-9;                              // [1, 12]
-    return year_month_day{date::year{y + (m <= 2)}, date::month(m), date::day(d)};
-}
-
-template<class>
-CONSTCD14
-inline
-year_month_day
-operator+(const year_month_day& ymd, const months& dm) NOEXCEPT
-{
-    return (ymd.year() / ymd.month() + dm) / ymd.day();
-}
-
-template<class>
-CONSTCD14
-inline
-year_month_day
-operator+(const months& dm, const year_month_day& ymd) NOEXCEPT
-{
-    return ymd + dm;
-}
-
-template<class>
-CONSTCD14
-inline
-year_month_day
-operator-(const year_month_day& ymd, const months& dm) NOEXCEPT
-{
-    return ymd + (-dm);
-}
-
-CONSTCD11
-inline
-year_month_day
-operator+(const year_month_day& ymd, const years& dy) NOEXCEPT
-{
-    return (ymd.year() + dy) / ymd.month() / ymd.day();
-}
-
-CONSTCD11
-inline
-year_month_day
-operator+(const years& dy, const year_month_day& ymd) NOEXCEPT
-{
-    return ymd + dy;
-}
-
-CONSTCD11
-inline
-year_month_day
-operator-(const year_month_day& ymd, const years& dy) NOEXCEPT
-{
-    return ymd + (-dy);
-}
-
-// year_month_weekday
-
-CONSTCD11
-inline
-year_month_weekday::year_month_weekday(const date::year& y, const date::month& m,
-                                       const date::weekday_indexed& wdi)
-        NOEXCEPT
-    : y_(y)
-    , m_(m)
-    , wdi_(wdi)
-    {}
-
-CONSTCD14
-inline
-year_month_weekday::year_month_weekday(const sys_days& dp) NOEXCEPT
-    : year_month_weekday(from_days(dp.time_since_epoch()))
-    {}
-
-CONSTCD14
-inline
-year_month_weekday::year_month_weekday(const local_days& dp) NOEXCEPT
-    : year_month_weekday(from_days(dp.time_since_epoch()))
-    {}
-
-template<class>
-CONSTCD14
-inline
-year_month_weekday&
-year_month_weekday::operator+=(const months& m) NOEXCEPT
-{
-    *this = *this + m;
-    return *this;
-}
-
-template<class>
-CONSTCD14
-inline
-year_month_weekday&
-year_month_weekday::operator-=(const months& m) NOEXCEPT
-{
-    *this = *this - m;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month_weekday&
-year_month_weekday::operator+=(const years& y) NOEXCEPT
-{
-    *this = *this + y;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month_weekday&
-year_month_weekday::operator-=(const years& y) NOEXCEPT
-{
-    *this = *this - y;
-    return *this;
-}
-
-CONSTCD11 inline year year_month_weekday::year() const NOEXCEPT {return y_;}
-CONSTCD11 inline month year_month_weekday::month() const NOEXCEPT {return m_;}
-
-CONSTCD11
-inline
-weekday
-year_month_weekday::weekday() const NOEXCEPT
-{
-    return wdi_.weekday();
-}
-
-CONSTCD11
-inline
-unsigned
-year_month_weekday::index() const NOEXCEPT
-{
-    return wdi_.index();
-}
-
-CONSTCD11
-inline
-weekday_indexed
-year_month_weekday::weekday_indexed() const NOEXCEPT
-{
-    return wdi_;
-}
-
-CONSTCD14
-inline
-year_month_weekday::operator sys_days() const NOEXCEPT
-{
-    return sys_days{to_days()};
-}
-
-CONSTCD14
-inline
-year_month_weekday::operator local_days() const NOEXCEPT
-{
-    return local_days{to_days()};
-}
-
-CONSTCD14
-inline
-bool
-year_month_weekday::ok() const NOEXCEPT
-{
-    if (!y_.ok() || !m_.ok() || !wdi_.weekday().ok() || wdi_.index() < 1)
-        return false;
-    if (wdi_.index() <= 4)
-        return true;
-    auto d2 = wdi_.weekday() - date::weekday(static_cast<sys_days>(y_/m_/1)) +
-                  days((wdi_.index()-1)*7 + 1);
-    return static_cast<unsigned>(d2.count()) <= static_cast<unsigned>((y_/m_/last).day());
-}
-
-CONSTCD14
-inline
-year_month_weekday
-year_month_weekday::from_days(days d) NOEXCEPT
-{
-    sys_days dp{d};
-    auto const wd = date::weekday(dp);
-    auto const ymd = year_month_day(dp);
-    return {ymd.year(), ymd.month(), wd[(static_cast<unsigned>(ymd.day())-1)/7+1]};
-}
-
-CONSTCD14
-inline
-days
-year_month_weekday::to_days() const NOEXCEPT
-{
-    auto d = sys_days(y_/m_/1);
-    return (d + (wdi_.weekday() - date::weekday(d) + days{(wdi_.index()-1)*7})
-           ).time_since_epoch();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT
-{
-    return x.year() == y.year() && x.month() == y.month() &&
-           x.weekday_indexed() == y.weekday_indexed();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_weekday& ymwdi)
-{
-    return os << ymwdi.year() << '/' << ymwdi.month()
-              << '/' << ymwdi.weekday_indexed();
-}
-
-template<class>
-CONSTCD14
-inline
-year_month_weekday
-operator+(const year_month_weekday& ymwd, const months& dm) NOEXCEPT
-{
-    return (ymwd.year() / ymwd.month() + dm) / ymwd.weekday_indexed();
-}
-
-template<class>
-CONSTCD14
-inline
-year_month_weekday
-operator+(const months& dm, const year_month_weekday& ymwd) NOEXCEPT
-{
-    return ymwd + dm;
-}
-
-template<class>
-CONSTCD14
-inline
-year_month_weekday
-operator-(const year_month_weekday& ymwd, const months& dm) NOEXCEPT
-{
-    return ymwd + (-dm);
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator+(const year_month_weekday& ymwd, const years& dy) NOEXCEPT
-{
-    return {ymwd.year()+dy, ymwd.month(), ymwd.weekday_indexed()};
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator+(const years& dy, const year_month_weekday& ymwd) NOEXCEPT
-{
-    return ymwd + dy;
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator-(const year_month_weekday& ymwd, const years& dy) NOEXCEPT
-{
-    return ymwd + (-dy);
-}
-
-// year_month_weekday_last
-
-CONSTCD11
-inline
-year_month_weekday_last::year_month_weekday_last(const date::year& y,
-                                                 const date::month& m,
-                                                 const date::weekday_last& wdl) NOEXCEPT
-    : y_(y)
-    , m_(m)
-    , wdl_(wdl)
-    {}
-
-template<class>
-CONSTCD14
-inline
-year_month_weekday_last&
-year_month_weekday_last::operator+=(const months& m) NOEXCEPT
-{
-    *this = *this + m;
-    return *this;
-}
-
-template<class>
-CONSTCD14
-inline
-year_month_weekday_last&
-year_month_weekday_last::operator-=(const months& m) NOEXCEPT
-{
-    *this = *this - m;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month_weekday_last&
-year_month_weekday_last::operator+=(const years& y) NOEXCEPT
-{
-    *this = *this + y;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month_weekday_last&
-year_month_weekday_last::operator-=(const years& y) NOEXCEPT
-{
-    *this = *this - y;
-    return *this;
-}
-
-CONSTCD11 inline year year_month_weekday_last::year() const NOEXCEPT {return y_;}
-CONSTCD11 inline month year_month_weekday_last::month() const NOEXCEPT {return m_;}
-
-CONSTCD11
-inline
-weekday
-year_month_weekday_last::weekday() const NOEXCEPT
-{
-    return wdl_.weekday();
-}
-
-CONSTCD11
-inline
-weekday_last
-year_month_weekday_last::weekday_last() const NOEXCEPT
-{
-    return wdl_;
-}
-
-CONSTCD14
-inline
-year_month_weekday_last::operator sys_days() const NOEXCEPT
-{
-    return sys_days{to_days()};
-}
-
-CONSTCD14
-inline
-year_month_weekday_last::operator local_days() const NOEXCEPT
-{
-    return local_days{to_days()};
-}
-
-CONSTCD11
-inline
-bool
-year_month_weekday_last::ok() const NOEXCEPT
-{
-    return y_.ok() && m_.ok() && wdl_.ok();
-}
-
-CONSTCD14
-inline
-days
-year_month_weekday_last::to_days() const NOEXCEPT
-{
-    auto const d = sys_days(y_/m_/last);
-    return (d - (date::weekday{d} - wdl_.weekday())).time_since_epoch();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT
-{
-    return x.year() == y.year() && x.month() == y.month() &&
-           x.weekday_last() == y.weekday_last();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_weekday_last& ymwdl)
-{
-    return os << ymwdl.year() << '/' << ymwdl.month() << '/' << ymwdl.weekday_last();
-}
-
-template<class>
-CONSTCD14
-inline
-year_month_weekday_last
-operator+(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT
-{
-    return (ymwdl.year() / ymwdl.month() + dm) / ymwdl.weekday_last();
-}
-
-template<class>
-CONSTCD14
-inline
-year_month_weekday_last
-operator+(const months& dm, const year_month_weekday_last& ymwdl) NOEXCEPT
-{
-    return ymwdl + dm;
-}
-
-template<class>
-CONSTCD14
-inline
-year_month_weekday_last
-operator-(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT
-{
-    return ymwdl + (-dm);
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator+(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT
-{
-    return {ymwdl.year()+dy, ymwdl.month(), ymwdl.weekday_last()};
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator+(const years& dy, const year_month_weekday_last& ymwdl) NOEXCEPT
-{
-    return ymwdl + dy;
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator-(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT
-{
-    return ymwdl + (-dy);
-}
-
-// year_month from operator/()
-
-CONSTCD11
-inline
-year_month
-operator/(const year& y, const month& m) NOEXCEPT
-{
-    return {y, m};
-}
-
-CONSTCD11
-inline
-year_month
-operator/(const year& y, int   m) NOEXCEPT
-{
-    return y / month(static_cast<unsigned>(m));
-}
-
-// month_day from operator/()
-
-CONSTCD11
-inline
-month_day
-operator/(const month& m, const day& d) NOEXCEPT
-{
-    return {m, d};
-}
-
-CONSTCD11
-inline
-month_day
-operator/(const day& d, const month& m) NOEXCEPT
-{
-    return m / d;
-}
-
-CONSTCD11
-inline
-month_day
-operator/(const month& m, int d) NOEXCEPT
-{
-    return m / day(static_cast<unsigned>(d));
-}
-
-CONSTCD11
-inline
-month_day
-operator/(int m, const day& d) NOEXCEPT
-{
-    return month(static_cast<unsigned>(m)) / d;
-}
-
-CONSTCD11 inline month_day operator/(const day& d, int m) NOEXCEPT {return m / d;}
-
-// month_day_last from operator/()
-
-CONSTCD11
-inline
-month_day_last
-operator/(const month& m, last_spec) NOEXCEPT
-{
-    return month_day_last{m};
-}
-
-CONSTCD11
-inline
-month_day_last
-operator/(last_spec, const month& m) NOEXCEPT
-{
-    return m/last;
-}
-
-CONSTCD11
-inline
-month_day_last
-operator/(int m, last_spec) NOEXCEPT
-{
-    return month(static_cast<unsigned>(m))/last;
-}
-
-CONSTCD11
-inline
-month_day_last
-operator/(last_spec, int m) NOEXCEPT
-{
-    return m/last;
-}
-
-// month_weekday from operator/()
-
-CONSTCD11
-inline
-month_weekday
-operator/(const month& m, const weekday_indexed& wdi) NOEXCEPT
-{
-    return {m, wdi};
-}
-
-CONSTCD11
-inline
-month_weekday
-operator/(const weekday_indexed& wdi, const month& m) NOEXCEPT
-{
-    return m / wdi;
-}
-
-CONSTCD11
-inline
-month_weekday
-operator/(int m, const weekday_indexed& wdi) NOEXCEPT
-{
-    return month(static_cast<unsigned>(m)) / wdi;
-}
-
-CONSTCD11
-inline
-month_weekday
-operator/(const weekday_indexed& wdi, int m) NOEXCEPT
-{
-    return m / wdi;
-}
-
-// month_weekday_last from operator/()
-
-CONSTCD11
-inline
-month_weekday_last
-operator/(const month& m, const weekday_last& wdl) NOEXCEPT
-{
-    return {m, wdl};
-}
-
-CONSTCD11
-inline
-month_weekday_last
-operator/(const weekday_last& wdl, const month& m) NOEXCEPT
-{
-    return m / wdl;
-}
-
-CONSTCD11
-inline
-month_weekday_last
-operator/(int m, const weekday_last& wdl) NOEXCEPT
-{
-    return month(static_cast<unsigned>(m)) / wdl;
-}
-
-CONSTCD11
-inline
-month_weekday_last
-operator/(const weekday_last& wdl, int m) NOEXCEPT
-{
-    return m / wdl;
-}
-
-// year_month_day from operator/()
-
-CONSTCD11
-inline
-year_month_day
-operator/(const year_month& ym, const day& d) NOEXCEPT
-{
-    return {ym.year(), ym.month(), d};
-}
-
-CONSTCD11
-inline
-year_month_day
-operator/(const year_month& ym, int d)  NOEXCEPT
-{
-    return ym / day(static_cast<unsigned>(d));
-}
-
-CONSTCD11
-inline
-year_month_day
-operator/(const year& y, const month_day& md) NOEXCEPT
-{
-    return y / md.month() / md.day();
-}
-
-CONSTCD11
-inline
-year_month_day
-operator/(int y, const month_day& md) NOEXCEPT
-{
-    return year(y) / md;
-}
-
-CONSTCD11
-inline
-year_month_day
-operator/(const month_day& md, const year& y)  NOEXCEPT
-{
-    return y / md;
-}
-
-CONSTCD11
-inline
-year_month_day
-operator/(const month_day& md, int y) NOEXCEPT
-{
-    return year(y) / md;
-}
-
-// year_month_day_last from operator/()
-
-CONSTCD11
-inline
-year_month_day_last
-operator/(const year_month& ym, last_spec) NOEXCEPT
-{
-    return {ym.year(), month_day_last{ym.month()}};
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator/(const year& y, const month_day_last& mdl) NOEXCEPT
-{
-    return {y, mdl};
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator/(int y, const month_day_last& mdl) NOEXCEPT
-{
-    return year(y) / mdl;
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator/(const month_day_last& mdl, const year& y) NOEXCEPT
-{
-    return y / mdl;
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator/(const month_day_last& mdl, int y) NOEXCEPT
-{
-    return year(y) / mdl;
-}
-
-// year_month_weekday from operator/()
-
-CONSTCD11
-inline
-year_month_weekday
-operator/(const year_month& ym, const weekday_indexed& wdi) NOEXCEPT
-{
-    return {ym.year(), ym.month(), wdi};
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator/(const year& y, const month_weekday& mwd) NOEXCEPT
-{
-    return {y, mwd.month(), mwd.weekday_indexed()};
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator/(int y, const month_weekday& mwd) NOEXCEPT
-{
-    return year(y) / mwd;
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator/(const month_weekday& mwd, const year& y) NOEXCEPT
-{
-    return y / mwd;
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator/(const month_weekday& mwd, int y) NOEXCEPT
-{
-    return year(y) / mwd;
-}
-
-// year_month_weekday_last from operator/()
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator/(const year_month& ym, const weekday_last& wdl) NOEXCEPT
-{
-    return {ym.year(), ym.month(), wdl};
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator/(const year& y, const month_weekday_last& mwdl) NOEXCEPT
-{
-    return {y, mwdl.month(), mwdl.weekday_last()};
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator/(int y, const month_weekday_last& mwdl) NOEXCEPT
-{
-    return year(y) / mwdl;
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator/(const month_weekday_last& mwdl, const year& y) NOEXCEPT
-{
-    return y / mwdl;
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator/(const month_weekday_last& mwdl, int y) NOEXCEPT
-{
-    return year(y) / mwdl;
-}
-
-template <class Duration>
-struct fields;
-
-template <class CharT, class Traits, class Duration>
-std::basic_ostream<CharT, Traits>&
-to_stream(std::basic_ostream<CharT, Traits>& os, const CharT* fmt,
-          const fields<Duration>& fds, const std::string* abbrev = nullptr,
-          const std::chrono::seconds* offset_sec = nullptr);
-
-template <class CharT, class Traits, class Duration, class Alloc>
-std::basic_istream<CharT, Traits>&
-from_stream(std::basic_istream<CharT, Traits>& is, const CharT* fmt,
-            fields<Duration>& fds, std::basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
-            std::chrono::minutes* offset = nullptr);
-
-// hh_mm_ss
-
-namespace detail
-{
-
-struct undocumented {explicit undocumented() = default;};
-
-// width<n>::value is the number of fractional decimal digits in 1/n
-// width<0>::value and width<1>::value are defined to be 0
-// If 1/n takes more than 18 fractional decimal digits,
-//   the result is truncated to 19.
-// Example:  width<2>::value    ==  1
-// Example:  width<3>::value    == 19
-// Example:  width<4>::value    ==  2
-// Example:  width<10>::value   ==  1
-// Example:  width<1000>::value ==  3
-template <std::uint64_t n, std::uint64_t d = 10, unsigned w = 0,
-          bool should_continue = !(n < 2) && d != 0 && (w < 19)>
-struct width
-{
-    static CONSTDATA unsigned value = 1 + width<n, d%n*10, w+1>::value;
-};
-
-template <std::uint64_t n, std::uint64_t d, unsigned w>
-struct width<n, d, w, false>
-{
-    static CONSTDATA unsigned value = 0;
-};
-
-template <unsigned exp>
-struct static_pow10
-{
-private:
-    static CONSTDATA std::uint64_t h = static_pow10<exp/2>::value;
-public:
-    static CONSTDATA std::uint64_t value = h * h * (exp % 2 ? 10 : 1);
-};
-
-template <>
-struct static_pow10<0>
-{
-    static CONSTDATA std::uint64_t value = 1;
-};
-
-template <class Duration>
-class decimal_format_seconds
-{
-    using CT = typename std::common_type<Duration, std::chrono::seconds>::type;
-    using rep = typename CT::rep;
-public:
-    static unsigned constexpr width = detail::width<CT::period::den>::value < 19 ?
-                                      detail::width<CT::period::den>::value : 6u;
-    using precision = std::chrono::duration<rep,
-                                            std::ratio<1, static_pow10<width>::value>>;
-
-private:
-    std::chrono::seconds s_;
-    precision            sub_s_;
-
-public:
-    CONSTCD11 decimal_format_seconds()
-        : s_()
-        , sub_s_()
-        {}
-
-    CONSTCD11 explicit decimal_format_seconds(const Duration& d) NOEXCEPT
-        : s_(std::chrono::duration_cast<std::chrono::seconds>(d))
-        , sub_s_(std::chrono::treat_as_floating_point<rep>::value ? d - s_ :
-                     std::chrono::duration_cast<precision>(d - s_))
-        {}
-
-    CONSTCD14 std::chrono::seconds& seconds() NOEXCEPT {return s_;}
-    CONSTCD11 std::chrono::seconds seconds() const NOEXCEPT {return s_;}
-    CONSTCD11 precision subseconds() const NOEXCEPT {return sub_s_;}
-
-    CONSTCD14 precision to_duration() const NOEXCEPT
-    {
-        return s_ + sub_s_;
-    }
-
-    CONSTCD11 bool in_conventional_range() const NOEXCEPT
-    {
-        return sub_s_ < std::chrono::seconds{1} && s_ < std::chrono::minutes{1};
-    }
-
-    template <class CharT, class Traits>
-    friend
-    std::basic_ostream<CharT, Traits>&
-    operator<<(std::basic_ostream<CharT, Traits>& os, const decimal_format_seconds& x)
-    {
-        return x.print(os, std::chrono::treat_as_floating_point<rep>{});
-    }
-
-    template <class CharT, class Traits>
-    std::basic_ostream<CharT, Traits>&
-    print(std::basic_ostream<CharT, Traits>& os, std::true_type) const
-    {
-        date::detail::save_ostream<CharT, Traits> _(os);
-        std::chrono::duration<rep> d = s_ + sub_s_;
-        if (d < std::chrono::seconds{10})
-            os << '0';
-        os << std::fixed << d.count();
-        return os;
-    }
-
-    template <class CharT, class Traits>
-    std::basic_ostream<CharT, Traits>&
-    print(std::basic_ostream<CharT, Traits>& os, std::false_type) const
-    {
-        date::detail::save_ostream<CharT, Traits> _(os);
-        os.fill('0');
-        os.flags(std::ios::dec | std::ios::right);
-        os.width(2);
-        os << s_.count();
-        if (width > 0)
-        {
-#if !ONLY_C_LOCALE
-            os << std::use_facet<std::numpunct<CharT>>(os.getloc()).decimal_point();
-#else
-            os << '.';
-#endif
-            date::detail::save_ostream<CharT, Traits> _s(os);
-            os.imbue(std::locale::classic());
-            os.width(width);
-            os << sub_s_.count();
-        }
-        return os;
-    }
-};
-
-template <class Rep, class Period>
-inline
-CONSTCD11
-typename std::enable_if
-         <
-            std::numeric_limits<Rep>::is_signed,
-            std::chrono::duration<Rep, Period>
-         >::type
-abs(std::chrono::duration<Rep, Period> d)
-{
-    return d >= d.zero() ? +d : -d;
-}
-
-template <class Rep, class Period>
-inline
-CONSTCD11
-typename std::enable_if
-         <
-            !std::numeric_limits<Rep>::is_signed,
-            std::chrono::duration<Rep, Period>
-         >::type
-abs(std::chrono::duration<Rep, Period> d)
-{
-    return d;
-}
-
-}  // namespace detail
-
-template <class Duration>
-class hh_mm_ss
-{
-    using dfs = detail::decimal_format_seconds<typename std::common_type<Duration,
-                                               std::chrono::seconds>::type>;
-
-    std::chrono::hours h_;
-    std::chrono::minutes m_;
-    dfs s_;
-    bool neg_;
-
-public:
-    static unsigned CONSTDATA fractional_width = dfs::width;
-    using precision = typename dfs::precision;
-
-    CONSTCD11 hh_mm_ss() NOEXCEPT
-        : hh_mm_ss(Duration::zero())
-        {}
-
-    CONSTCD11 explicit hh_mm_ss(Duration d) NOEXCEPT
-        : h_(std::chrono::duration_cast<std::chrono::hours>(detail::abs(d)))
-        , m_(std::chrono::duration_cast<std::chrono::minutes>(detail::abs(d)) - h_)
-        , s_(detail::abs(d) - h_ - m_)
-        , neg_(d < Duration::zero())
-        {}
-
-    CONSTCD11 std::chrono::hours hours() const NOEXCEPT {return h_;}
-    CONSTCD11 std::chrono::minutes minutes() const NOEXCEPT {return m_;}
-    CONSTCD11 std::chrono::seconds seconds() const NOEXCEPT {return s_.seconds();}
-    CONSTCD14 std::chrono::seconds&
-        seconds(detail::undocumented) NOEXCEPT {return s_.seconds();}
-    CONSTCD11 precision subseconds() const NOEXCEPT {return s_.subseconds();}
-    CONSTCD11 bool is_negative() const NOEXCEPT {return neg_;}
-
-    CONSTCD11 explicit operator  precision()   const NOEXCEPT {return to_duration();}
-    CONSTCD11          precision to_duration() const NOEXCEPT
-        {return (s_.to_duration() + m_ + h_) * (1-2*neg_);}
-
-    CONSTCD11 bool in_conventional_range() const NOEXCEPT
-    {
-        return !neg_ && h_ < days{1} && m_ < std::chrono::hours{1} &&
-               s_.in_conventional_range();
-    }
-
-private:
-
-    template <class charT, class traits>
-    friend
-    std::basic_ostream<charT, traits>&
-    operator<<(std::basic_ostream<charT, traits>& os, hh_mm_ss const& tod)
-    {
-        if (tod.is_negative())
-            os << '-';
-        if (tod.h_ < std::chrono::hours{10})
-            os << '0';
-        os << tod.h_.count() << ':';
-        if (tod.m_ < std::chrono::minutes{10})
-            os << '0';
-        os << tod.m_.count() << ':' << tod.s_;
-        return os;
-    }
-
-    template <class CharT, class Traits, class Duration2>
-    friend
-    std::basic_ostream<CharT, Traits>&
-    date::to_stream(std::basic_ostream<CharT, Traits>& os, const CharT* fmt,
-          const fields<Duration2>& fds, const std::string* abbrev,
-          const std::chrono::seconds* offset_sec);
-
-    template <class CharT, class Traits, class Duration2, class Alloc>
-    friend
-    std::basic_istream<CharT, Traits>&
-    date::from_stream(std::basic_istream<CharT, Traits>& is, const CharT* fmt,
-          fields<Duration2>& fds,
-          std::basic_string<CharT, Traits, Alloc>* abbrev, std::chrono::minutes* offset);
-};
-
-inline
-CONSTCD14
-bool
-is_am(std::chrono::hours const& h) NOEXCEPT
-{
-    using std::chrono::hours;
-    return hours{0} <= h && h < hours{12};
-}
-
-inline
-CONSTCD14
-bool
-is_pm(std::chrono::hours const& h) NOEXCEPT
-{
-    using std::chrono::hours;
-    return hours{12} <= h && h < hours{24};
-}
-
-inline
-CONSTCD14
-std::chrono::hours
-make12(std::chrono::hours h) NOEXCEPT
-{
-    using std::chrono::hours;
-    if (h < hours{12})
-    {
-        if (h == hours{0})
-            h = hours{12};
-    }
-    else
-    {
-        if (h != hours{12})
-            h = h - hours{12};
-    }
-    return h;
-}
-
-inline
-CONSTCD14
-std::chrono::hours
-make24(std::chrono::hours h, bool is_pm) NOEXCEPT
-{
-    using std::chrono::hours;
-    if (is_pm)
-    {
-        if (h != hours{12})
-            h = h + hours{12};
-    }
-    else if (h == hours{12})
-        h = hours{0};
-    return h;
-}
-
-template <class Duration>
-using time_of_day = hh_mm_ss<Duration>;
-
-template <class Rep, class Period,
-          class = typename std::enable_if
-              <!std::chrono::treat_as_floating_point<Rep>::value>::type>
-CONSTCD11
-inline
-hh_mm_ss<std::chrono::duration<Rep, Period>>
-make_time(const std::chrono::duration<Rep, Period>& d)
-{
-    return hh_mm_ss<std::chrono::duration<Rep, Period>>(d);
-}
-
-template <class CharT, class Traits, class Duration>
-inline
-typename std::enable_if
-<
-    !std::chrono::treat_as_floating_point<typename Duration::rep>::value &&
-        std::ratio_less<typename Duration::period, days::period>::value
-    , std::basic_ostream<CharT, Traits>&
->::type
-operator<<(std::basic_ostream<CharT, Traits>& os, const sys_time<Duration>& tp)
-{
-    auto const dp = date::floor<days>(tp);
-    return os << year_month_day(dp) << ' ' << make_time(tp-dp);
-}
-
-template <class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const sys_days& dp)
-{
-    return os << year_month_day(dp);
-}
-
-template <class CharT, class Traits, class Duration>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const local_time<Duration>& ut)
-{
-    return (os << sys_time<Duration>{ut.time_since_epoch()});
-}
-
-namespace detail
-{
-
-template <class CharT, std::size_t N>
-class string_literal;
-
-template <class CharT1, class CharT2, std::size_t N1, std::size_t N2>
-inline
-CONSTCD14
-string_literal<typename std::conditional<sizeof(CharT2) <= sizeof(CharT1), CharT1, CharT2>::type,
-               N1 + N2 - 1>
-operator+(const string_literal<CharT1, N1>& x, const string_literal<CharT2, N2>& y) NOEXCEPT;
-
-template <class CharT, std::size_t N>
-class string_literal
-{
-    CharT p_[N];
-
-    CONSTCD11 string_literal() NOEXCEPT
-      : p_{}
-    {}
-
-public:
-    using const_iterator = const CharT*;
-
-    string_literal(string_literal const&) = default;
-    string_literal& operator=(string_literal const&) = delete;
-
-    template <std::size_t N1 = 2,
-              class = typename std::enable_if<N1 == N>::type>
-    CONSTCD11 string_literal(CharT c) NOEXCEPT
-        : p_{c}
-    {
-    }
-
-    template <std::size_t N1 = 3,
-              class = typename std::enable_if<N1 == N>::type>
-    CONSTCD11 string_literal(CharT c1, CharT c2) NOEXCEPT
-        : p_{c1, c2}
-    {
-    }
-
-    template <std::size_t N1 = 4,
-              class = typename std::enable_if<N1 == N>::type>
-    CONSTCD11 string_literal(CharT c1, CharT c2, CharT c3) NOEXCEPT
-        : p_{c1, c2, c3}
-    {
-    }
-
-    CONSTCD14 string_literal(const CharT(&a)[N]) NOEXCEPT
-        : p_{}
-    {
-        for (std::size_t i = 0; i < N; ++i)
-            p_[i] = a[i];
-    }
-
-    template <class U = CharT,
-              class = typename std::enable_if<(1 < sizeof(U))>::type>
-    CONSTCD14 string_literal(const char(&a)[N]) NOEXCEPT
-        : p_{}
-    {
-        for (std::size_t i = 0; i < N; ++i)
-            p_[i] = a[i];
-    }
-
-    template <class CharT2,
-              class = typename std::enable_if<!std::is_same<CharT2, CharT>::value>::type>
-    CONSTCD14 string_literal(string_literal<CharT2, N> const& a) NOEXCEPT
-        : p_{}
-    {
-        for (std::size_t i = 0; i < N; ++i)
-            p_[i] = a[i];
-    }
-
-    CONSTCD11 const CharT* data() const NOEXCEPT {return p_;}
-    CONSTCD11 std::size_t size() const NOEXCEPT {return N-1;}
-
-    CONSTCD11 const_iterator begin() const NOEXCEPT {return p_;}
-    CONSTCD11 const_iterator end()   const NOEXCEPT {return p_ + N-1;}
-
-    CONSTCD11 CharT const& operator[](std::size_t n) const NOEXCEPT
-    {
-        return p_[n];
-    }
-
-    template <class Traits>
-    friend
-    std::basic_ostream<CharT, Traits>&
-    operator<<(std::basic_ostream<CharT, Traits>& os, const string_literal& s)
-    {
-        return os << s.p_;
-    }
-
-    template <class CharT1, class CharT2, std::size_t N1, std::size_t N2>
-    friend
-    CONSTCD14
-    string_literal<typename std::conditional<sizeof(CharT2) <= sizeof(CharT1), CharT1, CharT2>::type,
-                   N1 + N2 - 1>
-    operator+(const string_literal<CharT1, N1>& x, const string_literal<CharT2, N2>& y) NOEXCEPT;
-};
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 3>
-operator+(const string_literal<CharT, 2>& x, const string_literal<CharT, 2>& y) NOEXCEPT
-{
-  return string_literal<CharT, 3>(x[0], y[0]);
-}
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 4>
-operator+(const string_literal<CharT, 3>& x, const string_literal<CharT, 2>& y) NOEXCEPT
-{
-  return string_literal<CharT, 4>(x[0], x[1], y[0]);
-}
-
-template <class CharT1, class CharT2, std::size_t N1, std::size_t N2>
-CONSTCD14
-inline
-string_literal<typename std::conditional<sizeof(CharT2) <= sizeof(CharT1), CharT1, CharT2>::type,
-               N1 + N2 - 1>
-operator+(const string_literal<CharT1, N1>& x, const string_literal<CharT2, N2>& y) NOEXCEPT
-{
-    using CT = typename std::conditional<sizeof(CharT2) <= sizeof(CharT1), CharT1, CharT2>::type;
-
-    string_literal<CT, N1 + N2 - 1> r;
-    std::size_t i = 0;
-    for (; i < N1-1; ++i)
-       r.p_[i] = CT(x.p_[i]);
-    for (std::size_t j = 0; j < N2; ++j, ++i)
-       r.p_[i] = CT(y.p_[j]);
-
-    return r;
-}
-
-
-template <class CharT, class Traits, class Alloc, std::size_t N>
-inline
-std::basic_string<CharT, Traits, Alloc>
-operator+(std::basic_string<CharT, Traits, Alloc> x, const string_literal<CharT, N>& y)
-{
-    x.append(y.data(), y.size());
-    return x;
-}
-
-#if __cplusplus >= 201402  && (!defined(__EDG_VERSION__) || __EDG_VERSION__ > 411) \
-                           && (!defined(__SUNPRO_CC) || __SUNPRO_CC > 0x5150)
-
-template <class CharT,
-          class = std::enable_if_t<std::is_same<CharT, char>{} ||
-                                   std::is_same<CharT, wchar_t>{} ||
-                                   std::is_same<CharT, char16_t>{} ||
-                                   std::is_same<CharT, char32_t>{}>>
-CONSTCD14
-inline
-string_literal<CharT, 2>
-msl(CharT c) NOEXCEPT
-{
-    return string_literal<CharT, 2>{c};
-}
-
-CONSTCD14
-inline
-std::size_t
-to_string_len(std::intmax_t i)
-{
-    std::size_t r = 0;
-    do
-    {
-        i /= 10;
-        ++r;
-    } while (i > 0);
-    return r;
-}
-
-template <std::intmax_t N>
-CONSTCD14
-inline
-std::enable_if_t
-<
-    N < 10,
-    string_literal<char, to_string_len(N)+1>
->
-msl() NOEXCEPT
-{
-    return msl(char(N % 10 + '0'));
-}
-
-template <std::intmax_t N>
-CONSTCD14
-inline
-std::enable_if_t
-<
-    10 <= N,
-    string_literal<char, to_string_len(N)+1>
->
-msl() NOEXCEPT
-{
-    return msl<N/10>() + msl(char(N % 10 + '0'));
-}
-
-template <class CharT, std::intmax_t N, std::intmax_t D>
-CONSTCD14
-inline
-std::enable_if_t
-<
-    std::ratio<N, D>::type::den != 1,
-    string_literal<CharT, to_string_len(std::ratio<N, D>::type::num) +
-                          to_string_len(std::ratio<N, D>::type::den) + 4>
->
-msl(std::ratio<N, D>) NOEXCEPT
-{
-    using R = typename std::ratio<N, D>::type;
-    return msl(CharT{'['}) + msl<R::num>() + msl(CharT{'/'}) +
-                             msl<R::den>() + msl(CharT{']'});
-}
-
-template <class CharT, std::intmax_t N, std::intmax_t D>
-CONSTCD14
-inline
-std::enable_if_t
-<
-    std::ratio<N, D>::type::den == 1,
-    string_literal<CharT, to_string_len(std::ratio<N, D>::type::num) + 3>
->
-msl(std::ratio<N, D>) NOEXCEPT
-{
-    using R = typename std::ratio<N, D>::type;
-    return msl(CharT{'['}) + msl<R::num>() + msl(CharT{']'});
-}
-
-
-#else  // __cplusplus < 201402 || (defined(__EDG_VERSION__) && __EDG_VERSION__ <= 411)
-
-inline
-std::string
-to_string(std::uint64_t x)
-{
-    return std::to_string(x);
-}
-
-template <class CharT>
-inline
-std::basic_string<CharT>
-to_string(std::uint64_t x)
-{
-    auto y = std::to_string(x);
-    return std::basic_string<CharT>(y.begin(), y.end());
-}
-
-template <class CharT, std::intmax_t N, std::intmax_t D>
-inline
-typename std::enable_if
-<
-    std::ratio<N, D>::type::den != 1,
-    std::basic_string<CharT>
->::type
-msl(std::ratio<N, D>)
-{
-    using R = typename std::ratio<N, D>::type;
-    return std::basic_string<CharT>(1, '[') + to_string<CharT>(R::num) + CharT{'/'} +
-                                              to_string<CharT>(R::den) + CharT{']'};
-}
-
-template <class CharT, std::intmax_t N, std::intmax_t D>
-inline
-typename std::enable_if
-<
-    std::ratio<N, D>::type::den == 1,
-    std::basic_string<CharT>
->::type
-msl(std::ratio<N, D>)
-{
-    using R = typename std::ratio<N, D>::type;
-    return std::basic_string<CharT>(1, '[') + to_string<CharT>(R::num) + CharT{']'};
-}
-
-#endif  // __cplusplus < 201402 || (defined(__EDG_VERSION__) && __EDG_VERSION__ <= 411)
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 2>
-msl(std::atto) NOEXCEPT
-{
-    return string_literal<CharT, 2>{'a'};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 2>
-msl(std::femto) NOEXCEPT
-{
-    return string_literal<CharT, 2>{'f'};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 2>
-msl(std::pico) NOEXCEPT
-{
-    return string_literal<CharT, 2>{'p'};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 2>
-msl(std::nano) NOEXCEPT
-{
-    return string_literal<CharT, 2>{'n'};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-typename std::enable_if
-<
-    std::is_same<CharT, char>::value,
-    string_literal<char, 3>
->::type
-msl(std::micro) NOEXCEPT
-{
-    return string_literal<char, 3>{'\xC2', '\xB5'};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-typename std::enable_if
-<
-    !std::is_same<CharT, char>::value,
-    string_literal<CharT, 2>
->::type
-msl(std::micro) NOEXCEPT
-{
-    return string_literal<CharT, 2>{CharT{static_cast<unsigned char>('\xB5')}};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 2>
-msl(std::milli) NOEXCEPT
-{
-    return string_literal<CharT, 2>{'m'};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 2>
-msl(std::centi) NOEXCEPT
-{
-    return string_literal<CharT, 2>{'c'};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 3>
-msl(std::deca) NOEXCEPT
-{
-    return string_literal<CharT, 3>{'d', 'a'};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 2>
-msl(std::deci) NOEXCEPT
-{
-    return string_literal<CharT, 2>{'d'};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 2>
-msl(std::hecto) NOEXCEPT
-{
-    return string_literal<CharT, 2>{'h'};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 2>
-msl(std::kilo) NOEXCEPT
-{
-    return string_literal<CharT, 2>{'k'};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 2>
-msl(std::mega) NOEXCEPT
-{
-    return string_literal<CharT, 2>{'M'};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 2>
-msl(std::giga) NOEXCEPT
-{
-    return string_literal<CharT, 2>{'G'};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 2>
-msl(std::tera) NOEXCEPT
-{
-    return string_literal<CharT, 2>{'T'};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 2>
-msl(std::peta) NOEXCEPT
-{
-    return string_literal<CharT, 2>{'P'};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 2>
-msl(std::exa) NOEXCEPT
-{
-    return string_literal<CharT, 2>{'E'};
-}
-
-template <class CharT, class Period>
-CONSTCD11
-inline
-auto
-get_units(Period p)
- -> decltype(msl<CharT>(p) + string_literal<CharT, 2>{'s'})
-{
-    return msl<CharT>(p) + string_literal<CharT, 2>{'s'};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 2>
-get_units(std::ratio<1>)
-{
-    return string_literal<CharT, 2>{'s'};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 2>
-get_units(std::ratio<3600>)
-{
-    return string_literal<CharT, 2>{'h'};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 4>
-get_units(std::ratio<60>)
-{
-    return string_literal<CharT, 4>{'m', 'i', 'n'};
-}
-
-template <class CharT>
-CONSTCD11
-inline
-string_literal<CharT, 2>
-get_units(std::ratio<86400>)
-{
-    return string_literal<CharT, 2>{'d'};
-}
-
-template <class CharT, class Traits = std::char_traits<CharT>>
-struct make_string;
-
-template <>
-struct make_string<char>
-{
-    template <class Rep>
-    static
-    std::string
-    from(Rep n)
-    {
-        return std::to_string(n);
-    }
-};
-
-template <class Traits>
-struct make_string<char, Traits>
-{
-    template <class Rep>
-    static
-    std::basic_string<char, Traits>
-    from(Rep n)
-    {
-        auto s = std::to_string(n);
-        return std::basic_string<char, Traits>(s.begin(), s.end());
-    }
-};
-
-template <>
-struct make_string<wchar_t>
-{
-    template <class Rep>
-    static
-    std::wstring
-    from(Rep n)
-    {
-        return std::to_wstring(n);
-    }
-};
-
-template <class Traits>
-struct make_string<wchar_t, Traits>
-{
-    template <class Rep>
-    static
-    std::basic_string<wchar_t, Traits>
-    from(Rep n)
-    {
-        auto s = std::to_wstring(n);
-        return std::basic_string<wchar_t, Traits>(s.begin(), s.end());
-    }
-};
-
-}  // namespace detail
-
-// to_stream
-
-CONSTDATA year nanyear{-32768};
-
-template <class Duration>
-struct fields
-{
-    year_month_day        ymd{nanyear/0/0};
-    weekday               wd{8u};
-    hh_mm_ss<Duration>    tod{};
-    bool                  has_tod = false;
-
-    fields() = default;
-
-    fields(year_month_day ymd_) : ymd(ymd_) {}
-    fields(weekday wd_) : wd(wd_) {}
-    fields(hh_mm_ss<Duration> tod_) : tod(tod_), has_tod(true) {}
-
-    fields(year_month_day ymd_, weekday wd_) : ymd(ymd_), wd(wd_) {}
-    fields(year_month_day ymd_, hh_mm_ss<Duration> tod_) : ymd(ymd_), tod(tod_),
-                                                           has_tod(true) {}
-
-    fields(weekday wd_, hh_mm_ss<Duration> tod_) : wd(wd_), tod(tod_), has_tod(true) {}
-
-    fields(year_month_day ymd_, weekday wd_, hh_mm_ss<Duration> tod_)
-        : ymd(ymd_)
-        , wd(wd_)
-        , tod(tod_)
-        , has_tod(true)
-        {}
-};
-
-namespace detail
-{
-
-template <class CharT, class Traits, class Duration>
-unsigned
-extract_weekday(std::basic_ostream<CharT, Traits>& os, const fields<Duration>& fds)
-{
-    if (!fds.ymd.ok() && !fds.wd.ok())
-    {
-        // fds does not contain a valid weekday
-        os.setstate(std::ios::failbit);
-        return 8;
-    }
-    weekday wd;
-    if (fds.ymd.ok())
-    {
-        wd = weekday{sys_days(fds.ymd)};
-        if (fds.wd.ok() && wd != fds.wd)
-        {
-            // fds.ymd and fds.wd are inconsistent
-            os.setstate(std::ios::failbit);
-            return 8;
-        }
-    }
-    else
-        wd = fds.wd;
-    return static_cast<unsigned>((wd - Sunday).count());
-}
-
-template <class CharT, class Traits, class Duration>
-unsigned
-extract_month(std::basic_ostream<CharT, Traits>& os, const fields<Duration>& fds)
-{
-    if (!fds.ymd.month().ok())
-    {
-        // fds does not contain a valid month
-        os.setstate(std::ios::failbit);
-        return 0;
-    }
-    return static_cast<unsigned>(fds.ymd.month());
-}
-
-}  // namespace detail
-
-#if ONLY_C_LOCALE
-
-namespace detail
-{
-
-inline
-std::pair<const std::string*, const std::string*>
-weekday_names()
-{
-    static const std::string nm[] =
-    {
-        "Sunday",
-        "Monday",
-        "Tuesday",
-        "Wednesday",
-        "Thursday",
-        "Friday",
-        "Saturday",
-        "Sun",
-        "Mon",
-        "Tue",
-        "Wed",
-        "Thu",
-        "Fri",
-        "Sat"
-    };
-    return std::make_pair(nm, nm+sizeof(nm)/sizeof(nm[0]));
-}
-
-inline
-std::pair<const std::string*, const std::string*>
-month_names()
-{
-    static const std::string nm[] =
-    {
-        "January",
-        "February",
-        "March",
-        "April",
-        "May",
-        "June",
-        "July",
-        "August",
-        "September",
-        "October",
-        "November",
-        "December",
-        "Jan",
-        "Feb",
-        "Mar",
-        "Apr",
-        "May",
-        "Jun",
-        "Jul",
-        "Aug",
-        "Sep",
-        "Oct",
-        "Nov",
-        "Dec"
-    };
-    return std::make_pair(nm, nm+sizeof(nm)/sizeof(nm[0]));
-}
-
-inline
-std::pair<const std::string*, const std::string*>
-ampm_names()
-{
-    static const std::string nm[] =
-    {
-        "AM",
-        "PM"
-    };
-    return std::make_pair(nm, nm+sizeof(nm)/sizeof(nm[0]));
-}
-
-template <class CharT, class Traits, class FwdIter>
-FwdIter
-scan_keyword(std::basic_istream<CharT, Traits>& is, FwdIter kb, FwdIter ke)
-{
-    size_t nkw = static_cast<size_t>(std::distance(kb, ke));
-    const unsigned char doesnt_match = '\0';
-    const unsigned char might_match = '\1';
-    const unsigned char does_match = '\2';
-    unsigned char statbuf[100];
-    unsigned char* status = statbuf;
-    std::unique_ptr<unsigned char, void(*)(void*)> stat_hold(0, free);
-    if (nkw > sizeof(statbuf))
-    {
-        status = (unsigned char*)std::malloc(nkw);
-        if (status == nullptr)
-            throw std::bad_alloc();
-        stat_hold.reset(status);
-    }
-    size_t n_might_match = nkw;  // At this point, any keyword might match
-    size_t n_does_match = 0;     // but none of them definitely do
-    // Initialize all statuses to might_match, except for "" keywords are does_match
-    unsigned char* st = status;
-    for (auto ky = kb; ky != ke; ++ky, ++st)
-    {
-        if (!ky->empty())
-            *st = might_match;
-        else
-        {
-            *st = does_match;
-            --n_might_match;
-            ++n_does_match;
-        }
-    }
-    // While there might be a match, test keywords against the next CharT
-    for (size_t indx = 0; is && n_might_match > 0; ++indx)
-    {
-        // Peek at the next CharT but don't consume it
-        auto ic = is.peek();
-        if (ic == EOF)
-        {
-            is.setstate(std::ios::eofbit);
-            break;
-        }
-        auto c = static_cast<char>(toupper(ic));
-        bool consume = false;
-        // For each keyword which might match, see if the indx character is c
-        // If a match if found, consume c
-        // If a match is found, and that is the last character in the keyword,
-        //    then that keyword matches.
-        // If the keyword doesn't match this character, then change the keyword
-        //    to doesn't match
-        st = status;
-        for (auto ky = kb; ky != ke; ++ky, ++st)
-        {
-            if (*st == might_match)
-            {
-                if (c == static_cast<char>(toupper((*ky)[indx])))
-                {
-                    consume = true;
-                    if (ky->size() == indx+1)
-                    {
-                        *st = does_match;
-                        --n_might_match;
-                        ++n_does_match;
-                    }
-                }
-                else
-                {
-                    *st = doesnt_match;
-                    --n_might_match;
-                }
-            }
-        }
-        // consume if we matched a character
-        if (consume)
-        {
-            (void)is.get();
-            // If we consumed a character and there might be a matched keyword that
-            //   was marked matched on a previous iteration, then such keywords
-            //   are now marked as not matching.
-            if (n_might_match + n_does_match > 1)
-            {
-                st = status;
-                for (auto ky = kb; ky != ke; ++ky, ++st)
-                {
-                    if (*st == does_match && ky->size() != indx+1)
-                    {
-                        *st = doesnt_match;
-                        --n_does_match;
-                    }
-                }
-            }
-        }
-    }
-    // We've exited the loop because we hit eof and/or we have no more "might matches".
-    // Return the first matching result
-    for (st = status; kb != ke; ++kb, ++st)
-        if (*st == does_match)
-            break;
-    if (kb == ke)
-        is.setstate(std::ios::failbit);
-    return kb;
-}
-
-}  // namespace detail
-
-#endif  // ONLY_C_LOCALE
-
-template <class CharT, class Traits, class Duration>
-std::basic_ostream<CharT, Traits>&
-to_stream(std::basic_ostream<CharT, Traits>& os, const CharT* fmt,
-          const fields<Duration>& fds, const std::string* abbrev,
-          const std::chrono::seconds* offset_sec)
-{
-#if ONLY_C_LOCALE
-    using detail::weekday_names;
-    using detail::month_names;
-    using detail::ampm_names;
-#endif
-    using detail::save_ostream;
-    using detail::get_units;
-    using detail::extract_weekday;
-    using detail::extract_month;
-    using std::ios;
-    using std::chrono::duration_cast;
-    using std::chrono::seconds;
-    using std::chrono::minutes;
-    using std::chrono::hours;
-    date::detail::save_ostream<CharT, Traits> ss(os);
-    os.fill(' ');
-    os.flags(std::ios::skipws | std::ios::dec);
-    os.width(0);
-    tm tm{};
-    bool insert_negative = fds.has_tod && fds.tod.to_duration() < Duration::zero();
-#if !ONLY_C_LOCALE
-    auto& facet = std::use_facet<std::time_put<CharT>>(os.getloc());
-#endif
-    const CharT* command = nullptr;
-    CharT modified = CharT{};
-    for (; *fmt; ++fmt)
-    {
-        switch (*fmt)
-        {
-        case 'a':
-        case 'A':
-            if (command)
-            {
-                if (modified == CharT{})
-                {
-                    tm.tm_wday = static_cast<int>(extract_weekday(os, fds));
-                    if (os.fail())
-                        return os;
-#if !ONLY_C_LOCALE
-                    const CharT f[] = {'%', *fmt};
-                    facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f));
-#else  // ONLY_C_LOCALE
-                    os << weekday_names().first[tm.tm_wday+7*(*fmt == 'a')];
-#endif  // ONLY_C_LOCALE
-                }
-                else
-                {
-                    os << CharT{'%'} << modified << *fmt;
-                    modified = CharT{};
-                }
-                command = nullptr;
-            }
-            else
-                os << *fmt;
-            break;
-        case 'b':
-        case 'B':
-        case 'h':
-            if (command)
-            {
-                if (modified == CharT{})
-                {
-                    tm.tm_mon = static_cast<int>(extract_month(os, fds)) - 1;
-#if !ONLY_C_LOCALE
-                    const CharT f[] = {'%', *fmt};
-                    facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f));
-#else  // ONLY_C_LOCALE
-                    os << month_names().first[tm.tm_mon+12*(*fmt != 'B')];
-#endif  // ONLY_C_LOCALE
-                }
-                else
-                {
-                    os << CharT{'%'} << modified << *fmt;
-                    modified = CharT{};
-                }
-                command = nullptr;
-            }
-            else
-                os << *fmt;
-            break;
-        case 'c':
-        case 'x':
-            if (command)
-            {
-                if (modified == CharT{'O'})
-                    os << CharT{'%'} << modified << *fmt;
-                else
-                {
-                    if (!fds.ymd.ok())
-                        os.setstate(std::ios::failbit);
-                    if (*fmt == 'c' && !fds.has_tod)
-                        os.setstate(std::ios::failbit);
-#if !ONLY_C_LOCALE
-                    tm = std::tm{};
-                    auto const& ymd = fds.ymd;
-                    auto ld = local_days(ymd);
-                    if (*fmt == 'c')
-                    {
-                        tm.tm_sec = static_cast<int>(fds.tod.seconds().count());
-                        tm.tm_min = static_cast<int>(fds.tod.minutes().count());
-                        tm.tm_hour = static_cast<int>(fds.tod.hours().count());
-                    }
-                    tm.tm_mday = static_cast<int>(static_cast<unsigned>(ymd.day()));
-                    tm.tm_mon = static_cast<int>(extract_month(os, fds) - 1);
-                    tm.tm_year = static_cast<int>(ymd.year()) - 1900;
-                    tm.tm_wday = static_cast<int>(extract_weekday(os, fds));
-                    if (os.fail())
-                        return os;
-                    tm.tm_yday = static_cast<int>((ld - local_days(ymd.year()/1/1)).count());
-                    CharT f[3] = {'%'};
-                    auto fe = std::begin(f) + 1;
-                    if (modified == CharT{'E'})
-                        *fe++ = modified;
-                    *fe++ = *fmt;
-                    facet.put(os, os, os.fill(), &tm, std::begin(f), fe);
-#else  // ONLY_C_LOCALE
-                    if (*fmt == 'c')
-                    {
-                        auto wd = static_cast<int>(extract_weekday(os, fds));
-                        os << weekday_names().first[static_cast<unsigned>(wd)+7]
-                           << ' ';
-                        os << month_names().first[extract_month(os, fds)-1+12] << ' ';
-                        auto d = static_cast<int>(static_cast<unsigned>(fds.ymd.day()));
-                        if (d < 10)
-                            os << ' ';
-                        os << d << ' '
-                           << make_time(duration_cast<seconds>(fds.tod.to_duration()))
-                           << ' ' << fds.ymd.year();
-
-                    }
-                    else  // *fmt == 'x'
-                    {
-                        auto const& ymd = fds.ymd;
-                        save_ostream<CharT, Traits> _(os);
-                        os.fill('0');
-                        os.flags(std::ios::dec | std::ios::right);
-                        os.width(2);
-                        os << static_cast<unsigned>(ymd.month()) << CharT{'/'};
-                        os.width(2);
-                        os << static_cast<unsigned>(ymd.day()) << CharT{'/'};
-                        os.width(2);
-                        os << static_cast<int>(ymd.year()) % 100;
-                    }
-#endif  // ONLY_C_LOCALE
-                }
-                command = nullptr;
-                modified = CharT{};
-            }
-            else
-                os << *fmt;
-            break;
-        case 'C':
-            if (command)
-            {
-                if (modified == CharT{'O'})
-                    os << CharT{'%'} << modified << *fmt;
-                else
-                {
-                    if (!fds.ymd.year().ok())
-                        os.setstate(std::ios::failbit);
-                    auto y = static_cast<int>(fds.ymd.year());
-#if !ONLY_C_LOCALE
-                    if (modified == CharT{})
-#endif
-                    {
-                        save_ostream<CharT, Traits> _(os);
-                        os.fill('0');
-                        os.flags(std::ios::dec | std::ios::right);
-                        if (y >= 0)
-                        {
-                            os.width(2);
-                            os << y/100;
-                        }
-                        else
-                        {
-                            os << CharT{'-'};
-                            os.width(2);
-                            os << -(y-99)/100;
-                        }
-                    }
-#if !ONLY_C_LOCALE
-                    else if (modified == CharT{'E'})
-                    {
-                        tm.tm_year = y - 1900;
-                        CharT f[3] = {'%', 'E', 'C'};
-                        facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f));
-                    }
-#endif
-                }
-                command = nullptr;
-                modified = CharT{};
-            }
-            else
-                os << *fmt;
-            break;
-        case 'd':
-        case 'e':
-            if (command)
-            {
-                if (modified == CharT{'E'})
-                    os << CharT{'%'} << modified << *fmt;
-                else
-                {
-                    if (!fds.ymd.day().ok())
-                        os.setstate(std::ios::failbit);
-                    auto d = static_cast<int>(static_cast<unsigned>(fds.ymd.day()));
-#if !ONLY_C_LOCALE
-                    if (modified == CharT{})
-#endif
-                    {
-                        save_ostream<CharT, Traits> _(os);
-                        if (*fmt == CharT{'d'})
-                            os.fill('0');
-                        else
-                            os.fill(' ');
-                        os.flags(std::ios::dec | std::ios::right);
-                        os.width(2);
-                        os << d;
-                    }
-#if !ONLY_C_LOCALE
-                    else if (modified == CharT{'O'})
-                    {
-                        tm.tm_mday = d;
-                        CharT f[3] = {'%', 'O', *fmt};
-                        facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f));
-                    }
-#endif
-                }
-                command = nullptr;
-                modified = CharT{};
-            }
-            else
-                os << *fmt;
-            break;
-        case 'D':
-            if (command)
-            {
-                if (modified == CharT{})
-                {
-                    if (!fds.ymd.ok())
-                        os.setstate(std::ios::failbit);
-                    auto const& ymd = fds.ymd;
-                    save_ostream<CharT, Traits> _(os);
-                    os.fill('0');
-                    os.flags(std::ios::dec | std::ios::right);
-                    os.width(2);
-                    os << static_cast<unsigned>(ymd.month()) << CharT{'/'};
-                    os.width(2);
-                    os << static_cast<unsigned>(ymd.day()) << CharT{'/'};
-                    os.width(2);
-                    os << static_cast<int>(ymd.year()) % 100;
-                }
-                else
-                {
-                    os << CharT{'%'} << modified << *fmt;
-                    modified = CharT{};
-                }
-                command = nullptr;
-            }
-            else
-                os << *fmt;
-            break;
-        case 'F':
-            if (command)
-            {
-                if (modified == CharT{})
-                {
-                    if (!fds.ymd.ok())
-                        os.setstate(std::ios::failbit);
-                    auto const& ymd = fds.ymd;
-                    save_ostream<CharT, Traits> _(os);
-                    os.imbue(std::locale::classic());
-                    os.fill('0');
-                    os.flags(std::ios::dec | std::ios::right);
-                    os.width(4);
-                    os << static_cast<int>(ymd.year()) << CharT{'-'};
-                    os.width(2);
-                    os << static_cast<unsigned>(ymd.month()) << CharT{'-'};
-                    os.width(2);
-                    os << static_cast<unsigned>(ymd.day());
-                }
-                else
-                {
-                    os << CharT{'%'} << modified << *fmt;
-                    modified = CharT{};
-                }
-                command = nullptr;
-            }
-            else
-                os << *fmt;
-            break;
-        case 'g':
-        case 'G':
-            if (command)
-            {
-                if (modified == CharT{})
-                {
-                    if (!fds.ymd.ok())
-                        os.setstate(std::ios::failbit);
-                    auto ld = local_days(fds.ymd);
-                    auto y = year_month_day{ld + days{3}}.year();
-                    auto start = local_days((y-years{1})/December/Thursday[last]) +
-                                 (Monday-Thursday);
-                    if (ld < start)
-                        --y;
-                    if (*fmt == CharT{'G'})
-                        os << y;
-                    else
-                    {
-                        save_ostream<CharT, Traits> _(os);
-                        os.fill('0');
-                        os.flags(std::ios::dec | std::ios::right);
-                        os.width(2);
-                        os << std::abs(static_cast<int>(y)) % 100;
-                    }
-                }
-                else
-                {
-                    os << CharT{'%'} << modified << *fmt;
-                    modified = CharT{};
-                }
-                command = nullptr;
-            }
-            else
-                os << *fmt;
-            break;
-        case 'H':
-        case 'I':
-            if (command)
-            {
-                if (modified == CharT{'E'})
-                    os << CharT{'%'} << modified << *fmt;
-                else
-                {
-                    if (!fds.has_tod)
-                        os.setstate(std::ios::failbit);
-                    if (insert_negative)
-                    {
-                        os << '-';
-                        insert_negative = false;
-                    }
-                    auto hms = fds.tod;
-#if !ONLY_C_LOCALE
-                    if (modified == CharT{})
-#endif
-                    {
-                        auto h = *fmt == CharT{'I'} ? date::make12(hms.hours()) : hms.hours();
-                        if (h < hours{10})
-                            os << CharT{'0'};
-                        os << h.count();
-                    }
-#if !ONLY_C_LOCALE
-                    else if (modified == CharT{'O'})
-                    {
-                        const CharT f[] = {'%', modified, *fmt};
-                        tm.tm_hour = static_cast<int>(hms.hours().count());
-                        facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f));
-                    }
-#endif
-                }
-                modified = CharT{};
-                command = nullptr;
-            }
-            else
-                os << *fmt;
-            break;
-        case 'j':
-            if (command)
-            {
-                if (modified == CharT{})
-                {
-                    if (fds.ymd.ok() || fds.has_tod)
-                    {
-                        days doy;
-                        if (fds.ymd.ok())
-                        {
-                            auto ld = local_days(fds.ymd);
-                            auto y = fds.ymd.year();
-                            doy = ld - local_days(y/January/1) + days{1};
-                        }
-                        else
-                        {
-                            doy = duration_cast<days>(fds.tod.to_duration());
-                        }
-                        save_ostream<CharT, Traits> _(os);
-                        os.fill('0');
-                        os.flags(std::ios::dec | std::ios::right);
-                        os.width(3);
-                        os << doy.count();
-                    }
-                    else
-                    {
-                        os.setstate(std::ios::failbit);
-                    }
-                }
-                else
-                {
-                    os << CharT{'%'} << modified << *fmt;
-                    modified = CharT{};
-                }
-                command = nullptr;
-            }
-            else
-                os << *fmt;
-            break;
-        case 'm':
-            if (command)
-            {
-                if (modified == CharT{'E'})
-                    os << CharT{'%'} << modified << *fmt;
-                else
-                {
-                    if (!fds.ymd.month().ok())
-                        os.setstate(std::ios::failbit);
-                    auto m = static_cast<unsigned>(fds.ymd.month());
-#if !ONLY_C_LOCALE
-                    if (modified == CharT{})
-#endif
-                    {
-                        if (m < 10)
-                            os << CharT{'0'};
-                        os << m;
-                    }
-#if !ONLY_C_LOCALE
-                    else if (modified == CharT{'O'})
-                    {
-                        const CharT f[] = {'%', modified, *fmt};
-                        tm.tm_mon = static_cast<int>(m-1);
-                        facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f));
-                    }
-#endif
-                }
-                modified = CharT{};
-                command = nullptr;
-            }
-            else
-                os << *fmt;
-            break;
-        case 'M':
-            if (command)
-            {
-                if (modified == CharT{'E'})
-                    os << CharT{'%'} << modified << *fmt;
-                else
-                {
-                    if (!fds.has_tod)
-                        os.setstate(std::ios::failbit);
-                    if (insert_negative)
-                    {
-                        os << '-';
-                        insert_negative = false;
-                    }
-#if !ONLY_C_LOCALE
-                    if (modified == CharT{})
-#endif
-                    {
-                        if (fds.tod.minutes() < minutes{10})
-                            os << CharT{'0'};
-                        os << fds.tod.minutes().count();
-                    }
-#if !ONLY_C_LOCALE
-                    else if (modified == CharT{'O'})
-                    {
-                        const CharT f[] = {'%', modified, *fmt};
-                        tm.tm_min = static_cast<int>(fds.tod.minutes().count());
-                        facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f));
-                    }
-#endif
-                }
-                modified = CharT{};
-                command = nullptr;
-            }
-            else
-                os << *fmt;
-            break;
-        case 'n':
-            if (command)
-            {
-                if (modified == CharT{})
-                    os << CharT{'\n'};
-                else
-                {
-                    os << CharT{'%'} << modified << *fmt;
-                    modified = CharT{};
-                }
-                command = nullptr;
-            }
-            else
-                os << *fmt;
-            break;
-        case 'p':
-            if (command)
-            {
-                if (modified == CharT{})
-                {
-                    if (!fds.has_tod)
-                        os.setstate(std::ios::failbit);
-#if !ONLY_C_LOCALE
-                    const CharT f[] = {'%', *fmt};
-                    tm.tm_hour = static_cast<int>(fds.tod.hours().count());
-                    facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f));
-#else
-                    if (date::is_am(fds.tod.hours()))
-                        os << ampm_names().first[0];
-                    else
-                        os << ampm_names().first[1];
-#endif
-                }
-                else
-                {
-                    os << CharT{'%'} << modified << *fmt;
-                }
-                modified = CharT{};
-                command = nullptr;
-            }
-            else
-                os << *fmt;
-            break;
-        case 'Q':
-        case 'q':
-            if (command)
-            {
-                if (modified == CharT{})
-                {
-                    if (!fds.has_tod)
-                        os.setstate(std::ios::failbit);
-                    auto d = fds.tod.to_duration();
-                    if (*fmt == 'q')
-                        os << get_units<CharT>(typename decltype(d)::period::type{});
-                    else
-                        os << d.count();
-                }
-                else
-                {
-                    os << CharT{'%'} << modified << *fmt;
-                }
-                modified = CharT{};
-                command = nullptr;
-            }
-            else
-                os << *fmt;
-            break;
-        case 'r':
-            if (command)
-            {
-                if (modified == CharT{})
-                {
-                    if (!fds.has_tod)
-                        os.setstate(std::ios::failbit);
-#if !ONLY_C_LOCALE
-                    const CharT f[] = {'%', *fmt};
-                    tm.tm_hour = static_cast<int>(fds.tod.hours().count());
-                    tm.tm_min = static_cast<int>(fds.tod.minutes().count());
-                    tm.tm_sec = static_cast<int>(fds.tod.seconds().count());
-                    facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f));
-#else
-                    hh_mm_ss<seconds> tod(duration_cast<seconds>(fds.tod.to_duration()));
-                    save_ostream<CharT, Traits> _(os);
-                    os.fill('0');
-                    os.width(2);
-                    os << date::make12(tod.hours()).count() << CharT{':'};
-                    os.width(2);
-                    os << tod.minutes().count() << CharT{':'};
-                    os.width(2);
-                    os << tod.seconds().count() << CharT{' '};
-                    if (date::is_am(tod.hours()))
-                        os << ampm_names().first[0];
-                    else
-                        os << ampm_names().first[1];
-#endif
-                }
-                else
-                {
-                    os << CharT{'%'} << modified << *fmt;
-                }
-                modified = CharT{};
-                command = nullptr;
-            }
-            else
-                os << *fmt;
-            break;
-        case 'R':
-            if (command)
-            {
-                if (modified == CharT{})
-                {
-                    if (!fds.has_tod)
-                        os.setstate(std::ios::failbit);
-                    if (fds.tod.hours() < hours{10})
-                        os << CharT{'0'};
-                    os << fds.tod.hours().count() << CharT{':'};
-                    if (fds.tod.minutes() < minutes{10})
-                        os << CharT{'0'};
-                    os << fds.tod.minutes().count();
-                }
-                else
-                {
-                    os << CharT{'%'} << modified << *fmt;
-                    modified = CharT{};
-                }
-                command = nullptr;
-            }
-            else
-                os << *fmt;
-            break;
-        case 'S':
-            if (command)
-            {
-                if (modified == CharT{'E'})
-                    os << CharT{'%'} << modified << *fmt;
-                else
-                {
-                    if (!fds.has_tod)
-                        os.setstate(std::ios::failbit);
-                    if (insert_negative)
-                    {
-                        os << '-';
-                        insert_negative = false;
-                    }
-#if !ONLY_C_LOCALE
-                    if (modified == CharT{})
-#endif
-                    {
-                        os << fds.tod.s_;
-                    }
-#if !ONLY_C_LOCALE
-                    else if (modified == CharT{'O'})
-                    {
-                        const CharT f[] = {'%', modified, *fmt};
-                        tm.tm_sec = static_cast<int>(fds.tod.s_.seconds().count());
-                        facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f));
-                    }
-#endif
-                }
-                modified = CharT{};
-                command = nullptr;
-            }
-            else
-                os << *fmt;
-            break;
-        case 't':
-            if (command)
-            {
-                if (modified == CharT{})
-                    os << CharT{'\t'};
-                else
-                {
-                    os << CharT{'%'} << modified << *fmt;
-                    modified = CharT{};
-                }
-                command = nullptr;
-            }
-            else
-                os << *fmt;
-            break;
-        case 'T':
-            if (command)
-            {
-                if (modified == CharT{})
-                {
-                    if (!fds.has_tod)
-                        os.setstate(std::ios::failbit);
-                    os << fds.tod;
-                }
-                else
-                {
-                    os << CharT{'%'} << modified << *fmt;
-                    modified = CharT{};
-                }
-                command = nullptr;
-            }
-            else
-                os << *fmt;
-            break;
-        case 'u':
-            if (command)
-            {
-                if (modified == CharT{'E'})
-                    os << CharT{'%'} << modified << *fmt;
-                else
-                {
-                    auto wd = extract_weekday(os, fds);
-#if !ONLY_C_LOCALE
-                    if (modified == CharT{})
-#endif
-                    {
-                        os << (wd != 0 ? wd : 7u);
-                    }
-#if !ONLY_C_LOCALE
-                    else if (modified == CharT{'O'})
-                    {
-                        const CharT f[] = {'%', modified, *fmt};
-                        tm.tm_wday = static_cast<int>(wd);
-                        facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f));
-                    }
-#endif
-                }
-                modified = CharT{};
-                command = nullptr;
-            }
-            else
-                os << *fmt;
-            break;
-        case 'U':
-            if (command)
-            {
-                if (modified == CharT{'E'})
-                    os << CharT{'%'} << modified << *fmt;
-                else
-                {
-                    auto const& ymd = fds.ymd;
-                    if (!ymd.ok())
-                        os.setstate(std::ios::failbit);
-                    auto ld = local_days(ymd);
-#if !ONLY_C_LOCALE
-                    if (modified == CharT{})
-#endif
-                    {
-                        auto st = local_days(Sunday[1]/January/ymd.year());
-                        if (ld < st)
-                            os << CharT{'0'} << CharT{'0'};
-                        else
-                        {
-                            auto wn = duration_cast<weeks>(ld - st).count() + 1;
-                            if (wn < 10)
-                                os << CharT{'0'};
-                            os << wn;
-                        }
-                   }
- #if !ONLY_C_LOCALE
-                    else if (modified == CharT{'O'})
-                    {
-                        const CharT f[] = {'%', modified, *fmt};
-                        tm.tm_year = static_cast<int>(ymd.year()) - 1900;
-                        tm.tm_wday = static_cast<int>(extract_weekday(os, fds));
-                        if (os.fail())
-                            return os;
-                        tm.tm_yday = static_cast<int>((ld - local_days(ymd.year()/1/1)).count());
-                        facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f));
-                    }
-#endif
-                }
-                modified = CharT{};
-                command = nullptr;
-            }
-            else
-                os << *fmt;
-            break;
-        case 'V':
-            if (command)
-            {
-                if (modified == CharT{'E'})
-                    os << CharT{'%'} << modified << *fmt;
-                else
-                {
-                    if (!fds.ymd.ok())
-                        os.setstate(std::ios::failbit);
-                    auto ld = local_days(fds.ymd);
-#if !ONLY_C_LOCALE
-                    if (modified == CharT{})
-#endif
-                    {
-                        auto y = year_month_day{ld + days{3}}.year();
-                        auto st = local_days((y-years{1})/12/Thursday[last]) +
-                                  (Monday-Thursday);
-                        if (ld < st)
-                        {
-                            --y;
-                            st = local_days((y - years{1})/12/Thursday[last]) +
-                                 (Monday-Thursday);
-                        }
-                        auto wn = duration_cast<weeks>(ld - st).count() + 1;
-                        if (wn < 10)
-                            os << CharT{'0'};
-                        os << wn;
-                    }
-#if !ONLY_C_LOCALE
-                    else if (modified == CharT{'O'})
-                    {
-                        const CharT f[] = {'%', modified, *fmt};
-                        auto const& ymd = fds.ymd;
-                        tm.tm_year = static_cast<int>(ymd.year()) - 1900;
-                        tm.tm_wday = static_cast<int>(extract_weekday(os, fds));
-                        if (os.fail())
-                            return os;
-                        tm.tm_yday = static_cast<int>((ld - local_days(ymd.year()/1/1)).count());
-                        facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f));
-                    }
-#endif
-                }
-                modified = CharT{};
-                command = nullptr;
-            }
-            else
-                os << *fmt;
-            break;
-        case 'w':
-            if (command)
-            {
-                auto wd = extract_weekday(os, fds);
-                if (os.fail())
-                    return os;
-#if !ONLY_C_LOCALE
-                if (modified == CharT{})
-#else
-                if (modified != CharT{'E'})
-#endif
-                {
-                    os << wd;
-                }
-#if !ONLY_C_LOCALE
-                else if (modified == CharT{'O'})
-                {
-                    const CharT f[] = {'%', modified, *fmt};
-                    tm.tm_wday = static_cast<int>(wd);
-                    facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f));
-                }
-#endif
-                else
-                {
-                    os << CharT{'%'} << modified << *fmt;
-                }
-                modified = CharT{};
-                command = nullptr;
-            }
-            else
-                os << *fmt;
-            break;
-        case 'W':
-            if (command)
-            {
-                if (modified == CharT{'E'})
-                    os << CharT{'%'} << modified << *fmt;
-                else
-                {
-                    auto const& ymd = fds.ymd;
-                    if (!ymd.ok())
-                        os.setstate(std::ios::failbit);
-                    auto ld = local_days(ymd);
-#if !ONLY_C_LOCALE
-                    if (modified == CharT{})
-#endif
-                    {
-                        auto st = local_days(Monday[1]/January/ymd.year());
-                        if (ld < st)
-                            os << CharT{'0'} << CharT{'0'};
-                        else
-                        {
-                            auto wn = duration_cast<weeks>(ld - st).count() + 1;
-                            if (wn < 10)
-                                os << CharT{'0'};
-                            os << wn;
-                        }
-                    }
-#if !ONLY_C_LOCALE
-                    else if (modified == CharT{'O'})
-                    {
-                        const CharT f[] = {'%', modified, *fmt};
-                        tm.tm_year = static_cast<int>(ymd.year()) - 1900;
-                        tm.tm_wday = static_cast<int>(extract_weekday(os, fds));
-                        if (os.fail())
-                            return os;
-                        tm.tm_yday = static_cast<int>((ld - local_days(ymd.year()/1/1)).count());
-                        facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f));
-                    }
-#endif
-                }
-                modified = CharT{};
-                command = nullptr;
-            }
-            else
-                os << *fmt;
-            break;
-        case 'X':
-            if (command)
-            {
-                if (modified == CharT{'O'})
-                    os << CharT{'%'} << modified << *fmt;
-                else
-                {
-                    if (!fds.has_tod)
-                        os.setstate(std::ios::failbit);
-#if !ONLY_C_LOCALE
-                    tm = std::tm{};
-                    tm.tm_sec = static_cast<int>(fds.tod.seconds().count());
-                    tm.tm_min = static_cast<int>(fds.tod.minutes().count());
-                    tm.tm_hour = static_cast<int>(fds.tod.hours().count());
-                    CharT f[3] = {'%'};
-                    auto fe = std::begin(f) + 1;
-                    if (modified == CharT{'E'})
-                        *fe++ = modified;
-                    *fe++ = *fmt;
-                    facet.put(os, os, os.fill(), &tm, std::begin(f), fe);
-#else
-                    os << fds.tod;
-#endif
-                }
-                command = nullptr;
-                modified = CharT{};
-            }
-            else
-                os << *fmt;
-            break;
-        case 'y':
-            if (command)
-            {
-                if (!fds.ymd.year().ok())
-                    os.setstate(std::ios::failbit);
-                auto y = static_cast<int>(fds.ymd.year());
-#if !ONLY_C_LOCALE
-                if (modified == CharT{})
-                {
-#endif
-                    y = std::abs(y) % 100;
-                    if (y < 10)
-                        os << CharT{'0'};
-                    os << y;
-#if !ONLY_C_LOCALE
-                }
-                else
-                {
-                    const CharT f[] = {'%', modified, *fmt};
-                    tm.tm_year = y - 1900;
-                    facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f));
-                }
-#endif
-                modified = CharT{};
-                command = nullptr;
-            }
-            else
-                os << *fmt;
-            break;
-        case 'Y':
-            if (command)
-            {
-                if (modified == CharT{'O'})
-                    os << CharT{'%'} << modified << *fmt;
-                else
-                {
-                    if (!fds.ymd.year().ok())
-                        os.setstate(std::ios::failbit);
-                    auto y = fds.ymd.year();
-#if !ONLY_C_LOCALE
-                    if (modified == CharT{})
-#endif
-                    {
-                        save_ostream<CharT, Traits> _(os);
-                        os.imbue(std::locale::classic());
-                        os << y;
-                    }
-#if !ONLY_C_LOCALE
-                    else if (modified == CharT{'E'})
-                    {
-                        const CharT f[] = {'%', modified, *fmt};
-                        tm.tm_year = static_cast<int>(y) - 1900;
-                        facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f));
-                    }
-#endif
-                }
-                modified = CharT{};
-                command = nullptr;
-            }
-            else
-                os << *fmt;
-            break;
-        case 'z':
-            if (command)
-            {
-                if (offset_sec == nullptr)
-                {
-                    // Can not format %z with unknown offset
-                    os.setstate(ios::failbit);
-                    return os;
-                }
-                auto m = duration_cast<minutes>(*offset_sec);
-                auto neg = m < minutes{0};
-                m = date::abs(m);
-                auto h = duration_cast<hours>(m);
-                m -= h;
-                if (neg)
-                    os << CharT{'-'};
-                else
-                    os << CharT{'+'};
-                if (h < hours{10})
-                    os << CharT{'0'};
-                os << h.count();
-                if (modified != CharT{})
-                    os << CharT{':'};
-                if (m < minutes{10})
-                    os << CharT{'0'};
-                os << m.count();
-                command = nullptr;
-                modified = CharT{};
-            }
-            else
-                os << *fmt;
-            break;
-        case 'Z':
-            if (command)
-            {
-                if (modified == CharT{})
-                {
-                    if (abbrev == nullptr)
-                    {
-                        // Can not format %Z with unknown time_zone
-                        os.setstate(ios::failbit);
-                        return os;
-                    }
-                    for (auto c : *abbrev)
-                        os << CharT(c);
-                }
-                else
-                {
-                    os << CharT{'%'} << modified << *fmt;
-                    modified = CharT{};
-                }
-                command = nullptr;
-            }
-            else
-                os << *fmt;
-            break;
-        case 'E':
-        case 'O':
-            if (command)
-            {
-                if (modified == CharT{})
-                {
-                    modified = *fmt;
-                }
-                else
-                {
-                    os << CharT{'%'} << modified << *fmt;
-                    command = nullptr;
-                    modified = CharT{};
-                }
-            }
-            else
-                os << *fmt;
-            break;
-        case '%':
-            if (command)
-            {
-                if (modified == CharT{})
-                {
-                    os << CharT{'%'};
-                    command = nullptr;
-                }
-                else
-                {
-                    os << CharT{'%'} << modified << CharT{'%'};
-                    command = nullptr;
-                    modified = CharT{};
-                }
-            }
-            else
-                command = fmt;
-            break;
-        default:
-            if (command)
-            {
-                os << CharT{'%'};
-                command = nullptr;
-            }
-            if (modified != CharT{})
-            {
-                os << modified;
-                modified = CharT{};
-            }
-            os << *fmt;
-            break;
-        }
-    }
-    if (command)
-        os << CharT{'%'};
-    if (modified != CharT{})
-        os << modified;
-    return os;
-}
-
-template <class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-to_stream(std::basic_ostream<CharT, Traits>& os, const CharT* fmt, const year& y)
-{
-    using CT = std::chrono::seconds;
-    fields<CT> fds{y/0/0};
-    return to_stream(os, fmt, fds);
-}
-
-template <class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-to_stream(std::basic_ostream<CharT, Traits>& os, const CharT* fmt, const month& m)
-{
-    using CT = std::chrono::seconds;
-    fields<CT> fds{m/0/nanyear};
-    return to_stream(os, fmt, fds);
-}
-
-template <class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-to_stream(std::basic_ostream<CharT, Traits>& os, const CharT* fmt, const day& d)
-{
-    using CT = std::chrono::seconds;
-    fields<CT> fds{d/0/nanyear};
-    return to_stream(os, fmt, fds);
-}
-
-template <class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-to_stream(std::basic_ostream<CharT, Traits>& os, const CharT* fmt, const weekday& wd)
-{
-    using CT = std::chrono::seconds;
-    fields<CT> fds{wd};
-    return to_stream(os, fmt, fds);
-}
-
-template <class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-to_stream(std::basic_ostream<CharT, Traits>& os, const CharT* fmt, const year_month& ym)
-{
-    using CT = std::chrono::seconds;
-    fields<CT> fds{ym/0};
-    return to_stream(os, fmt, fds);
-}
-
-template <class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-to_stream(std::basic_ostream<CharT, Traits>& os, const CharT* fmt, const month_day& md)
-{
-    using CT = std::chrono::seconds;
-    fields<CT> fds{md/nanyear};
-    return to_stream(os, fmt, fds);
-}
-
-template <class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-to_stream(std::basic_ostream<CharT, Traits>& os, const CharT* fmt,
-          const year_month_day& ymd)
-{
-    using CT = std::chrono::seconds;
-    fields<CT> fds{ymd};
-    return to_stream(os, fmt, fds);
-}
-
-template <class CharT, class Traits, class Rep, class Period>
-inline
-std::basic_ostream<CharT, Traits>&
-to_stream(std::basic_ostream<CharT, Traits>& os, const CharT* fmt,
-          const std::chrono::duration<Rep, Period>& d)
-{
-    using Duration = std::chrono::duration<Rep, Period>;
-    using CT = typename std::common_type<Duration, std::chrono::seconds>::type;
-    fields<CT> fds{hh_mm_ss<CT>{d}};
-    return to_stream(os, fmt, fds);
-}
-
-template <class CharT, class Traits, class Duration>
-std::basic_ostream<CharT, Traits>&
-to_stream(std::basic_ostream<CharT, Traits>& os, const CharT* fmt,
-          const local_time<Duration>& tp, const std::string* abbrev = nullptr,
-          const std::chrono::seconds* offset_sec = nullptr)
-{
-    using CT = typename std::common_type<Duration, std::chrono::seconds>::type;
-    auto ld = floor<days>(tp);
-    fields<CT> fds{year_month_day{ld}, hh_mm_ss<CT>{tp-local_seconds{ld}}};
-    return to_stream(os, fmt, fds, abbrev, offset_sec);
-}
-
-template <class CharT, class Traits, class Duration>
-std::basic_ostream<CharT, Traits>&
-to_stream(std::basic_ostream<CharT, Traits>& os, const CharT* fmt,
-          const sys_time<Duration>& tp)
-{
-    using std::chrono::seconds;
-    using CT = typename std::common_type<Duration, seconds>::type;
-    const std::string abbrev("UTC");
-    CONSTDATA seconds offset{0};
-    auto sd = floor<days>(tp);
-    fields<CT> fds{year_month_day{sd}, hh_mm_ss<CT>{tp-sys_seconds{sd}}};
-    return to_stream(os, fmt, fds, &abbrev, &offset);
-}
-
-// format
-
-template <class CharT, class Streamable>
-auto
-format(const std::locale& loc, const CharT* fmt, const Streamable& tp)
-    -> decltype(to_stream(std::declval<std::basic_ostream<CharT>&>(), fmt, tp),
-                std::basic_string<CharT>{})
-{
-    std::basic_ostringstream<CharT> os;
-    os.exceptions(std::ios::failbit | std::ios::badbit);
-    os.imbue(loc);
-    to_stream(os, fmt, tp);
-    return os.str();
-}
-
-template <class CharT, class Streamable>
-auto
-format(const CharT* fmt, const Streamable& tp)
-    -> decltype(to_stream(std::declval<std::basic_ostream<CharT>&>(), fmt, tp),
-                std::basic_string<CharT>{})
-{
-    std::basic_ostringstream<CharT> os;
-    os.exceptions(std::ios::failbit | std::ios::badbit);
-    to_stream(os, fmt, tp);
-    return os.str();
-}
-
-template <class CharT, class Traits, class Alloc, class Streamable>
-auto
-format(const std::locale& loc, const std::basic_string<CharT, Traits, Alloc>& fmt,
-       const Streamable& tp)
-    -> decltype(to_stream(std::declval<std::basic_ostream<CharT, Traits>&>(), fmt.c_str(), tp),
-                std::basic_string<CharT, Traits, Alloc>{})
-{
-    std::basic_ostringstream<CharT, Traits, Alloc> os;
-    os.exceptions(std::ios::failbit | std::ios::badbit);
-    os.imbue(loc);
-    to_stream(os, fmt.c_str(), tp);
-    return os.str();
-}
-
-template <class CharT, class Traits, class Alloc, class Streamable>
-auto
-format(const std::basic_string<CharT, Traits, Alloc>& fmt, const Streamable& tp)
-    -> decltype(to_stream(std::declval<std::basic_ostream<CharT, Traits>&>(), fmt.c_str(), tp),
-                std::basic_string<CharT, Traits, Alloc>{})
-{
-    std::basic_ostringstream<CharT, Traits, Alloc> os;
-    os.exceptions(std::ios::failbit | std::ios::badbit);
-    to_stream(os, fmt.c_str(), tp);
-    return os.str();
-}
-
-// parse
-
-namespace detail
-{
-
-template <class CharT, class Traits>
-bool
-read_char(std::basic_istream<CharT, Traits>& is, CharT fmt, std::ios::iostate& err)
-{
-    auto ic = is.get();
-    if (Traits::eq_int_type(ic, Traits::eof()) ||
-       !Traits::eq(Traits::to_char_type(ic), fmt))
-    {
-        err |= std::ios::failbit;
-        is.setstate(std::ios::failbit);
-        return false;
-    }
-    return true;
-}
-
-template <class CharT, class Traits>
-unsigned
-read_unsigned(std::basic_istream<CharT, Traits>& is, unsigned m = 1, unsigned M = 10)
-{
-    unsigned x = 0;
-    unsigned count = 0;
-    while (true)
-    {
-        auto ic = is.peek();
-        if (Traits::eq_int_type(ic, Traits::eof()))
-            break;
-        auto c = static_cast<char>(Traits::to_char_type(ic));
-        if (!('0' <= c && c <= '9'))
-            break;
-        (void)is.get();
-        ++count;
-        x = 10*x + static_cast<unsigned>(c - '0');
-        if (count == M)
-            break;
-    }
-    if (count < m)
-        is.setstate(std::ios::failbit);
-    return x;
-}
-
-template <class CharT, class Traits>
-int
-read_signed(std::basic_istream<CharT, Traits>& is, unsigned m = 1, unsigned M = 10)
-{
-    auto ic = is.peek();
-    if (!Traits::eq_int_type(ic, Traits::eof()))
-    {
-        auto c = static_cast<char>(Traits::to_char_type(ic));
-        if (('0' <= c && c <= '9') || c == '-' || c == '+')
-        {
-            if (c == '-' || c == '+')
-                (void)is.get();
-            auto x = static_cast<int>(read_unsigned(is, std::max(m, 1u), M));
-            if (!is.fail())
-            {
-                if (c == '-')
-                    x = -x;
-                return x;
-            }
-        }
-    }
-    if (m > 0)
-        is.setstate(std::ios::failbit);
-    return 0;
-}
-
-template <class CharT, class Traits>
-long double
-read_long_double(std::basic_istream<CharT, Traits>& is, unsigned m = 1, unsigned M = 10)
-{
-    unsigned count = 0;
-    auto decimal_point = Traits::to_int_type(
-        std::use_facet<std::numpunct<CharT>>(is.getloc()).decimal_point());
-    std::string buf;
-    while (true)
-    {
-        auto ic = is.peek();
-        if (Traits::eq_int_type(ic, Traits::eof()))
-            break;
-        if (Traits::eq_int_type(ic, decimal_point))
-        {
-            buf += '.';
-            decimal_point = Traits::eof();
-            is.get();
-        }
-        else
-        {
-            auto c = static_cast<char>(Traits::to_char_type(ic));
-            if (!('0' <= c && c <= '9'))
-                break;
-            buf += c;
-            (void)is.get();
-        }
-        if (++count == M)
-            break;
-    }
-    if (count < m)
-    {
-        is.setstate(std::ios::failbit);
-        return 0;
-    }
-    return std::stold(buf);
-}
-
-struct rs
-{
-    int& i;
-    unsigned m;
-    unsigned M;
-};
-
-struct ru
-{
-    int& i;
-    unsigned m;
-    unsigned M;
-};
-
-struct rld
-{
-    long double& i;
-    unsigned m;
-    unsigned M;
-};
-
-template <class CharT, class Traits>
-void
-read(std::basic_istream<CharT, Traits>&)
-{
-}
-
-template <class CharT, class Traits, class ...Args>
-void
-read(std::basic_istream<CharT, Traits>& is, CharT a0, Args&& ...args);
-
-template <class CharT, class Traits, class ...Args>
-void
-read(std::basic_istream<CharT, Traits>& is, rs a0, Args&& ...args);
-
-template <class CharT, class Traits, class ...Args>
-void
-read(std::basic_istream<CharT, Traits>& is, ru a0, Args&& ...args);
-
-template <class CharT, class Traits, class ...Args>
-void
-read(std::basic_istream<CharT, Traits>& is, int a0, Args&& ...args);
-
-template <class CharT, class Traits, class ...Args>
-void
-read(std::basic_istream<CharT, Traits>& is, rld a0, Args&& ...args);
-
-template <class CharT, class Traits, class ...Args>
-void
-read(std::basic_istream<CharT, Traits>& is, CharT a0, Args&& ...args)
-{
-    // No-op if a0 == CharT{}
-    if (a0 != CharT{})
-    {
-        auto ic = is.peek();
-        if (Traits::eq_int_type(ic, Traits::eof()))
-        {
-            is.setstate(std::ios::failbit | std::ios::eofbit);
-            return;
-        }
-        if (!Traits::eq(Traits::to_char_type(ic), a0))
-        {
-            is.setstate(std::ios::failbit);
-            return;
-        }
-        (void)is.get();
-    }
-    read(is, std::forward<Args>(args)...);
-}
-
-template <class CharT, class Traits, class ...Args>
-void
-read(std::basic_istream<CharT, Traits>& is, rs a0, Args&& ...args)
-{
-    auto x = read_signed(is, a0.m, a0.M);
-    if (is.fail())
-        return;
-    a0.i = x;
-    read(is, std::forward<Args>(args)...);
-}
-
-template <class CharT, class Traits, class ...Args>
-void
-read(std::basic_istream<CharT, Traits>& is, ru a0, Args&& ...args)
-{
-    auto x = read_unsigned(is, a0.m, a0.M);
-    if (is.fail())
-        return;
-    a0.i = static_cast<int>(x);
-    read(is, std::forward<Args>(args)...);
-}
-
-template <class CharT, class Traits, class ...Args>
-void
-read(std::basic_istream<CharT, Traits>& is, int a0, Args&& ...args)
-{
-    if (a0 != -1)
-    {
-        auto u = static_cast<unsigned>(a0);
-        CharT buf[std::numeric_limits<unsigned>::digits10+2u] = {};
-        auto e = buf;
-        do
-        {
-            *e++ = static_cast<CharT>(CharT(u % 10) + CharT{'0'});
-            u /= 10;
-        } while (u > 0);
-        std::reverse(buf, e);
-        for (auto p = buf; p != e && is.rdstate() == std::ios::goodbit; ++p)
-            read(is, *p);
-    }
-    if (is.rdstate() == std::ios::goodbit)
-        read(is, std::forward<Args>(args)...);
-}
-
-template <class CharT, class Traits, class ...Args>
-void
-read(std::basic_istream<CharT, Traits>& is, rld a0, Args&& ...args)
-{
-    auto x = read_long_double(is, a0.m, a0.M);
-    if (is.fail())
-        return;
-    a0.i = x;
-    read(is, std::forward<Args>(args)...);
-}
-
-template <class T, class CharT, class Traits>
-inline
-void
-checked_set(T& value, T from, T not_a_value, std::basic_ios<CharT, Traits>& is)
-{
-    if (!is.fail())
-    {
-        if (value == not_a_value)
-            value = std::move(from);
-        else if (value != from)
-            is.setstate(std::ios::failbit);
-    }
-}
-
-}  // namespace detail;
-
-template <class CharT, class Traits, class Duration, class Alloc = std::allocator<CharT>>
-std::basic_istream<CharT, Traits>&
-from_stream(std::basic_istream<CharT, Traits>& is, const CharT* fmt,
-            fields<Duration>& fds, std::basic_string<CharT, Traits, Alloc>* abbrev,
-            std::chrono::minutes* offset)
-{
-    using std::numeric_limits;
-    using std::ios;
-    using std::chrono::duration;
-    using std::chrono::duration_cast;
-    using std::chrono::seconds;
-    using std::chrono::minutes;
-    using std::chrono::hours;
-    typename std::basic_istream<CharT, Traits>::sentry ok{is, true};
-    if (ok)
-    {
-        date::detail::save_istream<CharT, Traits> ss(is);
-        is.fill(' ');
-        is.flags(std::ios::skipws | std::ios::dec);
-        is.width(0);
-#if !ONLY_C_LOCALE
-        auto& f = std::use_facet<std::time_get<CharT>>(is.getloc());
-        std::tm tm{};
-#endif
-        const CharT* command = nullptr;
-        auto modified = CharT{};
-        auto width = -1;
-
-        CONSTDATA int not_a_year = numeric_limits<int>::min();
-        CONSTDATA int not_a_2digit_year = 100;
-        CONSTDATA int not_a_century = not_a_year / 100;
-        CONSTDATA int not_a_month = 0;
-        CONSTDATA int not_a_day = 0;
-        CONSTDATA int not_a_hour = numeric_limits<int>::min();
-        CONSTDATA int not_a_hour_12_value = 0;
-        CONSTDATA int not_a_minute = not_a_hour;
-        CONSTDATA Duration not_a_second = Duration::min();
-        CONSTDATA int not_a_doy = -1;
-        CONSTDATA int not_a_weekday = 8;
-        CONSTDATA int not_a_week_num = 100;
-        CONSTDATA int not_a_ampm = -1;
-        CONSTDATA minutes not_a_offset = minutes::min();
-
-        int Y = not_a_year;             // c, F, Y                   *
-        int y = not_a_2digit_year;      // D, x, y                   *
-        int g = not_a_2digit_year;      // g                         *
-        int G = not_a_year;             // G                         *
-        int C = not_a_century;          // C                         *
-        int m = not_a_month;            // b, B, h, m, c, D, F, x    *
-        int d = not_a_day;              // c, d, D, e, F, x          *
-        int j = not_a_doy;              // j                         *
-        int wd = not_a_weekday;         // a, A, u, w                *
-        int H = not_a_hour;             // c, H, R, T, X             *
-        int I = not_a_hour_12_value;    // I, r                      *
-        int p = not_a_ampm;             // p, r                      *
-        int M = not_a_minute;           // c, M, r, R, T, X          *
-        Duration s = not_a_second;      // c, r, S, T, X             *
-        int U = not_a_week_num;         // U                         *
-        int V = not_a_week_num;         // V                         *
-        int W = not_a_week_num;         // W                         *
-        std::basic_string<CharT, Traits, Alloc> temp_abbrev;  // Z   *
-        minutes temp_offset = not_a_offset;  // z                    *
-
-        using detail::read;
-        using detail::rs;
-        using detail::ru;
-        using detail::rld;
-        using detail::checked_set;
-        for (; *fmt != CharT{} && !is.fail(); ++fmt)
-        {
-            switch (*fmt)
-            {
-            case 'a':
-            case 'A':
-            case 'u':
-            case 'w':  // wd:  a, A, u, w
-                if (command)
-                {
-                    int trial_wd = not_a_weekday;
-                    if (*fmt == 'a' || *fmt == 'A')
-                    {
-                        if (modified == CharT{})
-                        {
-#if !ONLY_C_LOCALE
-                            ios::iostate err = ios::goodbit;
-                            f.get(is, nullptr, is, err, &tm, command, fmt+1);
-                            is.setstate(err);
-                            if (!is.fail())
-                                trial_wd = tm.tm_wday;
-#else
-                            auto nm = detail::weekday_names();
-                            auto i = detail::scan_keyword(is, nm.first, nm.second) - nm.first;
-                            if (!is.fail())
-                                trial_wd = i % 7;
-#endif
-                        }
-                        else
-                            read(is, CharT{'%'}, width, modified, *fmt);
-                    }
-                    else  // *fmt == 'u' || *fmt == 'w'
-                    {
-#if !ONLY_C_LOCALE
-                        if (modified == CharT{})
-#else
-                        if (modified != CharT{'E'})
-#endif
-                        {
-                            read(is, ru{trial_wd, 1, width == -1 ?
-                                                      1u : static_cast<unsigned>(width)});
-                            if (!is.fail())
-                            {
-                                if (*fmt == 'u')
-                                {
-                                    if (!(1 <= trial_wd && trial_wd <= 7))
-                                    {
-                                        trial_wd = not_a_weekday;
-                                        is.setstate(ios::failbit);
-                                    }
-                                    else if (trial_wd == 7)
-                                        trial_wd = 0;
-                                }
-                                else  // *fmt == 'w'
-                                {
-                                    if (!(0 <= trial_wd && trial_wd <= 6))
-                                    {
-                                        trial_wd = not_a_weekday;
-                                        is.setstate(ios::failbit);
-                                    }
-                                }
-                            }
-                        }
-#if !ONLY_C_LOCALE
-                        else if (modified == CharT{'O'})
-                        {
-                            ios::iostate err = ios::goodbit;
-                            f.get(is, nullptr, is, err, &tm, command, fmt+1);
-                            is.setstate(err);
-                            if (!is.fail())
-                                trial_wd = tm.tm_wday;
-                        }
-#endif
-                        else
-                            read(is, CharT{'%'}, width, modified, *fmt);
-                    }
-                    if (trial_wd != not_a_weekday)
-                        checked_set(wd, trial_wd, not_a_weekday, is);
-                }
-                else  // !command
-                    read(is, *fmt);
-                command = nullptr;
-                width = -1;
-                modified = CharT{};
-                break;
-            case 'b':
-            case 'B':
-            case 'h':
-                if (command)
-                {
-                    if (modified == CharT{})
-                    {
-                        int ttm = not_a_month;
-#if !ONLY_C_LOCALE
-                        ios::iostate err = ios::goodbit;
-                        f.get(is, nullptr, is, err, &tm, command, fmt+1);
-                        if ((err & ios::failbit) == 0)
-                            ttm = tm.tm_mon + 1;
-                        is.setstate(err);
-#else
-                        auto nm = detail::month_names();
-                        auto i = detail::scan_keyword(is, nm.first, nm.second) - nm.first;
-                        if (!is.fail())
-                            ttm = i % 12 + 1;
-#endif
-                        checked_set(m, ttm, not_a_month, is);
-                    }
-                    else
-                        read(is, CharT{'%'}, width, modified, *fmt);
-                    command = nullptr;
-                    width = -1;
-                    modified = CharT{};
-                }
-                else
-                    read(is, *fmt);
-                break;
-            case 'c':
-                if (command)
-                {
-                    if (modified != CharT{'O'})
-                    {
-#if !ONLY_C_LOCALE
-                        ios::iostate err = ios::goodbit;
-                        f.get(is, nullptr, is, err, &tm, command, fmt+1);
-                        if ((err & ios::failbit) == 0)
-                        {
-                            checked_set(Y, tm.tm_year + 1900, not_a_year, is);
-                            checked_set(m, tm.tm_mon + 1, not_a_month, is);
-                            checked_set(d, tm.tm_mday, not_a_day, is);
-                            checked_set(H, tm.tm_hour, not_a_hour, is);
-                            checked_set(M, tm.tm_min, not_a_minute, is);
-                            checked_set(s, duration_cast<Duration>(seconds{tm.tm_sec}),
-                                        not_a_second, is);
-                        }
-                        is.setstate(err);
-#else
-                        // "%a %b %e %T %Y"
-                        auto nm = detail::weekday_names();
-                        auto i = detail::scan_keyword(is, nm.first, nm.second) - nm.first;
-                        checked_set(wd, static_cast<int>(i % 7), not_a_weekday, is);
-                        ws(is);
-                        nm = detail::month_names();
-                        i = detail::scan_keyword(is, nm.first, nm.second) - nm.first;
-                        checked_set(m, static_cast<int>(i % 12 + 1), not_a_month, is);
-                        ws(is);
-                        int td = not_a_day;
-                        read(is, rs{td, 1, 2});
-                        checked_set(d, td, not_a_day, is);
-                        ws(is);
-                        using dfs = detail::decimal_format_seconds<Duration>;
-                        CONSTDATA auto w = Duration::period::den == 1 ? 2 : 3 + dfs::width;
-                        int tH;
-                        int tM;
-                        long double S;
-                        read(is, ru{tH, 1, 2}, CharT{':'}, ru{tM, 1, 2},
-                                               CharT{':'}, rld{S, 1, w});
-                        checked_set(H, tH, not_a_hour, is);
-                        checked_set(M, tM, not_a_minute, is);
-                        checked_set(s, round<Duration>(duration<long double>{S}),
-                                    not_a_second, is);
-                        ws(is);
-                        int tY = not_a_year;
-                        read(is, rs{tY, 1, 4u});
-                        checked_set(Y, tY, not_a_year, is);
-#endif
-                    }
-                    else
-                        read(is, CharT{'%'}, width, modified, *fmt);
-                    command = nullptr;
-                    width = -1;
-                    modified = CharT{};
-                }
-                else
-                    read(is, *fmt);
-                break;
-            case 'x':
-                if (command)
-                {
-                    if (modified != CharT{'O'})
-                    {
-#if !ONLY_C_LOCALE
-                        ios::iostate err = ios::goodbit;
-                        f.get(is, nullptr, is, err, &tm, command, fmt+1);
-                        if ((err & ios::failbit) == 0)
-                        {
-                            checked_set(Y, tm.tm_year + 1900, not_a_year, is);
-                            checked_set(m, tm.tm_mon + 1, not_a_month, is);
-                            checked_set(d, tm.tm_mday, not_a_day, is);
-                        }
-                        is.setstate(err);
-#else
-                        // "%m/%d/%y"
-                        int ty = not_a_2digit_year;
-                        int tm = not_a_month;
-                        int td = not_a_day;
-                        read(is, ru{tm, 1, 2}, CharT{'/'}, ru{td, 1, 2}, CharT{'/'},
-                                 rs{ty, 1, 2});
-                        checked_set(y, ty, not_a_2digit_year, is);
-                        checked_set(m, tm, not_a_month, is);
-                        checked_set(d, td, not_a_day, is);
-#endif
-                    }
-                    else
-                        read(is, CharT{'%'}, width, modified, *fmt);
-                    command = nullptr;
-                    width = -1;
-                    modified = CharT{};
-                }
-                else
-                    read(is, *fmt);
-                break;
-            case 'X':
-                if (command)
-                {
-                    if (modified != CharT{'O'})
-                    {
-#if !ONLY_C_LOCALE
-                        ios::iostate err = ios::goodbit;
-                        f.get(is, nullptr, is, err, &tm, command, fmt+1);
-                        if ((err & ios::failbit) == 0)
-                        {
-                            checked_set(H, tm.tm_hour, not_a_hour, is);
-                            checked_set(M, tm.tm_min, not_a_minute, is);
-                            checked_set(s, duration_cast<Duration>(seconds{tm.tm_sec}),
-                                        not_a_second, is);
-                        }
-                        is.setstate(err);
-#else
-                        // "%T"
-                        using dfs = detail::decimal_format_seconds<Duration>;
-                        CONSTDATA auto w = Duration::period::den == 1 ? 2 : 3 + dfs::width;
-                        int tH = not_a_hour;
-                        int tM = not_a_minute;
-                        long double S;
-                        read(is, ru{tH, 1, 2}, CharT{':'}, ru{tM, 1, 2},
-                                               CharT{':'}, rld{S, 1, w});
-                        checked_set(H, tH, not_a_hour, is);
-                        checked_set(M, tM, not_a_minute, is);
-                        checked_set(s, round<Duration>(duration<long double>{S}),
-                                    not_a_second, is);
-#endif
-                    }
-                    else
-                        read(is, CharT{'%'}, width, modified, *fmt);
-                    command = nullptr;
-                    width = -1;
-                    modified = CharT{};
-                }
-                else
-                    read(is, *fmt);
-                break;
-            case 'C':
-                if (command)
-                {
-                    int tC = not_a_century;
-#if !ONLY_C_LOCALE
-                    if (modified == CharT{})
-                    {
-#endif
-                        read(is, rs{tC, 1, width == -1 ? 2u : static_cast<unsigned>(width)});
-#if !ONLY_C_LOCALE
-                    }
-                    else
-                    {
-                        ios::iostate err = ios::goodbit;
-                        f.get(is, nullptr, is, err, &tm, command, fmt+1);
-                        if ((err & ios::failbit) == 0)
-                        {
-                            auto tY = tm.tm_year + 1900;
-                            tC = (tY >= 0 ? tY : tY-99) / 100;
-                        }
-                        is.setstate(err);
-                    }
-#endif
-                    checked_set(C, tC, not_a_century, is);
-                    command = nullptr;
-                    width = -1;
-                    modified = CharT{};
-                }
-                else
-                    read(is, *fmt);
-                break;
-            case 'D':
-                if (command)
-                {
-                    if (modified == CharT{})
-                    {
-                        int tn = not_a_month;
-                        int td = not_a_day;
-                        int ty = not_a_2digit_year;
-                        read(is, ru{tn, 1, 2}, CharT{'\0'}, CharT{'/'}, CharT{'\0'},
-                                 ru{td, 1, 2}, CharT{'\0'}, CharT{'/'}, CharT{'\0'},
-                                 rs{ty, 1, 2});
-                        checked_set(y, ty, not_a_2digit_year, is);
-                        checked_set(m, tn, not_a_month, is);
-                        checked_set(d, td, not_a_day, is);
-                    }
-                    else
-                        read(is, CharT{'%'}, width, modified, *fmt);
-                    command = nullptr;
-                    width = -1;
-                    modified = CharT{};
-                }
-                else
-                    read(is, *fmt);
-                break;
-            case 'F':
-                if (command)
-                {
-                    if (modified == CharT{})
-                    {
-                        int tY = not_a_year;
-                        int tn = not_a_month;
-                        int td = not_a_day;
-                        read(is, rs{tY, 1, width == -1 ? 4u : static_cast<unsigned>(width)},
-                                 CharT{'-'}, ru{tn, 1, 2}, CharT{'-'}, ru{td, 1, 2});
-                        checked_set(Y, tY, not_a_year, is);
-                        checked_set(m, tn, not_a_month, is);
-                        checked_set(d, td, not_a_day, is);
-                    }
-                    else
-                        read(is, CharT{'%'}, width, modified, *fmt);
-                    command = nullptr;
-                    width = -1;
-                    modified = CharT{};
-                }
-                else
-                    read(is, *fmt);
-                break;
-            case 'd':
-            case 'e':
-                if (command)
-                {
-#if !ONLY_C_LOCALE
-                    if (modified == CharT{})
-#else
-                    if (modified != CharT{'E'})
-#endif
-                    {
-                        int td = not_a_day;
-                        read(is, rs{td, 1, width == -1 ? 2u : static_cast<unsigned>(width)});
-                        checked_set(d, td, not_a_day, is);
-                    }
-#if !ONLY_C_LOCALE
-                    else if (modified == CharT{'O'})
-                    {
-                        ios::iostate err = ios::goodbit;
-                        f.get(is, nullptr, is, err, &tm, command, fmt+1);
-                        command = nullptr;
-                        width = -1;
-                        modified = CharT{};
-                        if ((err & ios::failbit) == 0)
-                            checked_set(d, tm.tm_mday, not_a_day, is);
-                        is.setstate(err);
-                    }
-#endif
-                    else
-                        read(is, CharT{'%'}, width, modified, *fmt);
-                    command = nullptr;
-                    width = -1;
-                    modified = CharT{};
-                }
-                else
-                    read(is, *fmt);
-                break;
-            case 'H':
-                if (command)
-                {
-#if !ONLY_C_LOCALE
-                    if (modified == CharT{})
-#else
-                    if (modified != CharT{'E'})
-#endif
-                    {
-                        int tH = not_a_hour;
-                        read(is, ru{tH, 1, width == -1 ? 2u : static_cast<unsigned>(width)});
-                        checked_set(H, tH, not_a_hour, is);
-                    }
-#if !ONLY_C_LOCALE
-                    else if (modified == CharT{'O'})
-                    {
-                        ios::iostate err = ios::goodbit;
-                        f.get(is, nullptr, is, err, &tm, command, fmt+1);
-                        if ((err & ios::failbit) == 0)
-                            checked_set(H, tm.tm_hour, not_a_hour, is);
-                        is.setstate(err);
-                    }
-#endif
-                    else
-                        read(is, CharT{'%'}, width, modified, *fmt);
-                    command = nullptr;
-                    width = -1;
-                    modified = CharT{};
-                }
-                else
-                    read(is, *fmt);
-                break;
-            case 'I':
-                if (command)
-                {
-                    if (modified == CharT{})
-                    {
-                        int tI = not_a_hour_12_value;
-                        // reads in an hour into I, but most be in [1, 12]
-                        read(is, rs{tI, 1, width == -1 ? 2u : static_cast<unsigned>(width)});
-                        if (!(1 <= tI && tI <= 12))
-                            is.setstate(ios::failbit);
-                        checked_set(I, tI, not_a_hour_12_value, is);
-                    }
-                    else
-                        read(is, CharT{'%'}, width, modified, *fmt);
-                    command = nullptr;
-                    width = -1;
-                    modified = CharT{};
-                }
-                else
-                    read(is, *fmt);
-               break;
-            case 'j':
-                if (command)
-                {
-                    if (modified == CharT{})
-                    {
-                        int tj = not_a_doy;
-                        read(is, ru{tj, 1, width == -1 ? 3u : static_cast<unsigned>(width)});
-                        checked_set(j, tj, not_a_doy, is);
-                    }
-                    else
-                        read(is, CharT{'%'}, width, modified, *fmt);
-                    command = nullptr;
-                    width = -1;
-                    modified = CharT{};
-                }
-                else
-                    read(is, *fmt);
-                break;
-            case 'M':
-                if (command)
-                {
-#if !ONLY_C_LOCALE
-                    if (modified == CharT{})
-#else
-                    if (modified != CharT{'E'})
-#endif
-                    {
-                        int tM = not_a_minute;
-                        read(is, ru{tM, 1, width == -1 ? 2u : static_cast<unsigned>(width)});
-                        checked_set(M, tM, not_a_minute, is);
-                    }
-#if !ONLY_C_LOCALE
-                    else if (modified == CharT{'O'})
-                    {
-                        ios::iostate err = ios::goodbit;
-                        f.get(is, nullptr, is, err, &tm, command, fmt+1);
-                        if ((err & ios::failbit) == 0)
-                            checked_set(M, tm.tm_min, not_a_minute, is);
-                        is.setstate(err);
-                    }
-#endif
-                    else
-                        read(is, CharT{'%'}, width, modified, *fmt);
-                    command = nullptr;
-                    width = -1;
-                    modified = CharT{};
-                }
-                else
-                    read(is, *fmt);
-                break;
-            case 'm':
-                if (command)
-                {
-#if !ONLY_C_LOCALE
-                    if (modified == CharT{})
-#else
-                    if (modified != CharT{'E'})
-#endif
-                    {
-                        int tn = not_a_month;
-                        read(is, rs{tn, 1, width == -1 ? 2u : static_cast<unsigned>(width)});
-                        checked_set(m, tn, not_a_month, is);
-                    }
-#if !ONLY_C_LOCALE
-                    else if (modified == CharT{'O'})
-                    {
-                        ios::iostate err = ios::goodbit;
-                        f.get(is, nullptr, is, err, &tm, command, fmt+1);
-                        if ((err & ios::failbit) == 0)
-                            checked_set(m, tm.tm_mon + 1, not_a_month, is);
-                        is.setstate(err);
-                    }
-#endif
-                    else
-                        read(is, CharT{'%'}, width, modified, *fmt);
-                    command = nullptr;
-                    width = -1;
-                    modified = CharT{};
-                }
-                else
-                    read(is, *fmt);
-                break;
-            case 'n':
-            case 't':
-                if (command)
-                {
-                    if (modified == CharT{})
-                    {
-                        // %n matches a single white space character
-                        // %t matches 0 or 1 white space characters
-                        auto ic = is.peek();
-                        if (Traits::eq_int_type(ic, Traits::eof()))
-                        {
-                            ios::iostate err = ios::eofbit;
-                            if (*fmt == 'n')
-                                err |= ios::failbit;
-                            is.setstate(err);
-                            break;
-                        }
-                        if (isspace(ic))
-                        {
-                            (void)is.get();
-                        }
-                        else if (*fmt == 'n')
-                            is.setstate(ios::failbit);
-                    }
-                    else
-                        read(is, CharT{'%'}, width, modified, *fmt);
-                    command = nullptr;
-                    width = -1;
-                    modified = CharT{};
-                }
-                else
-                    read(is, *fmt);
-                break;
-            case 'p':
-                if (command)
-                {
-                    if (modified == CharT{})
-                    {
-                        int tp = not_a_ampm;
-#if !ONLY_C_LOCALE
-                        tm = std::tm{};
-                        tm.tm_hour = 1;
-                        ios::iostate err = ios::goodbit;
-                        f.get(is, nullptr, is, err, &tm, command, fmt+1);
-                        is.setstate(err);
-                        if (tm.tm_hour == 1)
-                            tp = 0;
-                        else if (tm.tm_hour == 13)
-                            tp = 1;
-                        else
-                            is.setstate(err);
-#else
-                        auto nm = detail::ampm_names();
-                        auto i = detail::scan_keyword(is, nm.first, nm.second) - nm.first;
-                        tp = i;
-#endif
-                        checked_set(p, tp, not_a_ampm, is);
-                    }
-                    else
-                        read(is, CharT{'%'}, width, modified, *fmt);
-                    command = nullptr;
-                    width = -1;
-                    modified = CharT{};
-                }
-                else
-                    read(is, *fmt);
-
-               break;
-            case 'r':
-                if (command)
-                {
-                    if (modified == CharT{})
-                    {
-#if !ONLY_C_LOCALE
-                        ios::iostate err = ios::goodbit;
-                        f.get(is, nullptr, is, err, &tm, command, fmt+1);
-                        if ((err & ios::failbit) == 0)
-                        {
-                            checked_set(H, tm.tm_hour, not_a_hour, is);
-                            checked_set(M, tm.tm_min, not_a_hour, is);
-                            checked_set(s, duration_cast<Duration>(seconds{tm.tm_sec}),
-                                        not_a_second, is);
-                        }
-                        is.setstate(err);
-#else
-                        // "%I:%M:%S %p"
-                        using dfs = detail::decimal_format_seconds<Duration>;
-                        CONSTDATA auto w = Duration::period::den == 1 ? 2 : 3 + dfs::width;
-                        long double S;
-                        int tI = not_a_hour_12_value;
-                        int tM = not_a_minute;
-                        read(is, ru{tI, 1, 2}, CharT{':'}, ru{tM, 1, 2},
-                                               CharT{':'}, rld{S, 1, w});
-                        checked_set(I, tI, not_a_hour_12_value, is);
-                        checked_set(M, tM, not_a_minute, is);
-                        checked_set(s, round<Duration>(duration<long double>{S}),
-                                    not_a_second, is);
-                        ws(is);
-                        auto nm = detail::ampm_names();
-                        auto i = detail::scan_keyword(is, nm.first, nm.second) - nm.first;
-                        checked_set(p, static_cast<int>(i), not_a_ampm, is);
-#endif
-                    }
-                    else
-                        read(is, CharT{'%'}, width, modified, *fmt);
-                    command = nullptr;
-                    width = -1;
-                    modified = CharT{};
-                }
-                else
-                    read(is, *fmt);
-                break;
-            case 'R':
-                if (command)
-                {
-                    if (modified == CharT{})
-                    {
-                        int tH = not_a_hour;
-                        int tM = not_a_minute;
-                        read(is, ru{tH, 1, 2}, CharT{'\0'}, CharT{':'}, CharT{'\0'},
-                                 ru{tM, 1, 2}, CharT{'\0'});
-                        checked_set(H, tH, not_a_hour, is);
-                        checked_set(M, tM, not_a_minute, is);
-                    }
-                    else
-                        read(is, CharT{'%'}, width, modified, *fmt);
-                    command = nullptr;
-                    width = -1;
-                    modified = CharT{};
-                }
-                else
-                    read(is, *fmt);
-                break;
-            case 'S':
-                if (command)
-                {
- #if !ONLY_C_LOCALE
-                   if (modified == CharT{})
-#else
-                   if (modified != CharT{'E'})
-#endif
-                    {
-                        using dfs = detail::decimal_format_seconds<Duration>;
-                        CONSTDATA auto w = Duration::period::den == 1 ? 2 : 3 + dfs::width;
-                        long double S;
-                        read(is, rld{S, 1, width == -1 ? w : static_cast<unsigned>(width)});
-                        checked_set(s, round<Duration>(duration<long double>{S}),
-                                    not_a_second, is);
-                    }
-#if !ONLY_C_LOCALE
-                    else if (modified == CharT{'O'})
-                    {
-                        ios::iostate err = ios::goodbit;
-                        f.get(is, nullptr, is, err, &tm, command, fmt+1);
-                        if ((err & ios::failbit) == 0)
-                            checked_set(s, duration_cast<Duration>(seconds{tm.tm_sec}),
-                                        not_a_second, is);
-                        is.setstate(err);
-                    }
-#endif
-                    else
-                        read(is, CharT{'%'}, width, modified, *fmt);
-                    command = nullptr;
-                    width = -1;
-                    modified = CharT{};
-                }
-                else
-                    read(is, *fmt);
-                break;
-            case 'T':
-                if (command)
-                {
-                    if (modified == CharT{})
-                    {
-                        using dfs = detail::decimal_format_seconds<Duration>;
-                        CONSTDATA auto w = Duration::period::den == 1 ? 2 : 3 + dfs::width;
-                        int tH = not_a_hour;
-                        int tM = not_a_minute;
-                        long double S;
-                        read(is, ru{tH, 1, 2}, CharT{':'}, ru{tM, 1, 2},
-                                               CharT{':'}, rld{S, 1, w});
-                        checked_set(H, tH, not_a_hour, is);
-                        checked_set(M, tM, not_a_minute, is);
-                        checked_set(s, round<Duration>(duration<long double>{S}),
-                                    not_a_second, is);
-                    }
-                    else
-                        read(is, CharT{'%'}, width, modified, *fmt);
-                    command = nullptr;
-                    width = -1;
-                    modified = CharT{};
-                }
-                else
-                    read(is, *fmt);
-                break;
-            case 'Y':
-                if (command)
-                {
-#if !ONLY_C_LOCALE
-                    if (modified == CharT{})
-#else
-                    if (modified != CharT{'O'})
-#endif
-                    {
-                        int tY = not_a_year;
-                        read(is, rs{tY, 1, width == -1 ? 4u : static_cast<unsigned>(width)});
-                        checked_set(Y, tY, not_a_year, is);
-                    }
-#if !ONLY_C_LOCALE
-                    else if (modified == CharT{'E'})
-                    {
-                        ios::iostate err = ios::goodbit;
-                        f.get(is, nullptr, is, err, &tm, command, fmt+1);
-                        if ((err & ios::failbit) == 0)
-                            checked_set(Y, tm.tm_year + 1900, not_a_year, is);
-                        is.setstate(err);
-                    }
-#endif
-                    else
-                        read(is, CharT{'%'}, width, modified, *fmt);
-                    command = nullptr;
-                    width = -1;
-                    modified = CharT{};
-                }
-                else
-                    read(is, *fmt);
-                break;
-            case 'y':
-                if (command)
-                {
-#if !ONLY_C_LOCALE
-                    if (modified == CharT{})
-#endif
-                    {
-                        int ty = not_a_2digit_year;
-                        read(is, ru{ty, 1, width == -1 ? 2u : static_cast<unsigned>(width)});
-                        checked_set(y, ty, not_a_2digit_year, is);
-                    }
-#if !ONLY_C_LOCALE
-                    else
-                    {
-                        ios::iostate err = ios::goodbit;
-                        f.get(is, nullptr, is, err, &tm, command, fmt+1);
-                        if ((err & ios::failbit) == 0)
-                            checked_set(Y, tm.tm_year + 1900, not_a_year, is);
-                        is.setstate(err);
-                    }
-#endif
-                    command = nullptr;
-                    width = -1;
-                    modified = CharT{};
-                }
-                else
-                    read(is, *fmt);
-                break;
-            case 'g':
-                if (command)
-                {
-                    if (modified == CharT{})
-                    {
-                        int tg = not_a_2digit_year;
-                        read(is, ru{tg, 1, width == -1 ? 2u : static_cast<unsigned>(width)});
-                        checked_set(g, tg, not_a_2digit_year, is);
-                    }
-                    else
-                        read(is, CharT{'%'}, width, modified, *fmt);
-                    command = nullptr;
-                    width = -1;
-                    modified = CharT{};
-                }
-                else
-                    read(is, *fmt);
-                break;
-            case 'G':
-                if (command)
-                {
-                    if (modified == CharT{})
-                    {
-                        int tG = not_a_year;
-                        read(is, rs{tG, 1, width == -1 ? 4u : static_cast<unsigned>(width)});
-                        checked_set(G, tG, not_a_year, is);
-                    }
-                    else
-                        read(is, CharT{'%'}, width, modified, *fmt);
-                    command = nullptr;
-                    width = -1;
-                    modified = CharT{};
-                }
-                else
-                    read(is, *fmt);
-                break;
-            case 'U':
-                if (command)
-                {
-                    if (modified == CharT{})
-                    {
-                        int tU = not_a_week_num;
-                        read(is, ru{tU, 1, width == -1 ? 2u : static_cast<unsigned>(width)});
-                        checked_set(U, tU, not_a_week_num, is);
-                    }
-                    else
-                        read(is, CharT{'%'}, width, modified, *fmt);
-                    command = nullptr;
-                    width = -1;
-                    modified = CharT{};
-                }
-                else
-                    read(is, *fmt);
-                break;
-            case 'V':
-                if (command)
-                {
-                    if (modified == CharT{})
-                    {
-                        int tV = not_a_week_num;
-                        read(is, ru{tV, 1, width == -1 ? 2u : static_cast<unsigned>(width)});
-                        checked_set(V, tV, not_a_week_num, is);
-                    }
-                    else
-                        read(is, CharT{'%'}, width, modified, *fmt);
-                    command = nullptr;
-                    width = -1;
-                    modified = CharT{};
-                }
-                else
-                    read(is, *fmt);
-                break;
-            case 'W':
-                if (command)
-                {
-                    if (modified == CharT{})
-                    {
-                        int tW = not_a_week_num;
-                        read(is, ru{tW, 1, width == -1 ? 2u : static_cast<unsigned>(width)});
-                        checked_set(W, tW, not_a_week_num, is);
-                    }
-                    else
-                        read(is, CharT{'%'}, width, modified, *fmt);
-                    command = nullptr;
-                    width = -1;
-                    modified = CharT{};
-                }
-                else
-                    read(is, *fmt);
-                break;
-            case 'E':
-            case 'O':
-                if (command)
-                {
-                    if (modified == CharT{})
-                    {
-                        modified = *fmt;
-                    }
-                    else
-                    {
-                        read(is, CharT{'%'}, width, modified, *fmt);
-                        command = nullptr;
-                        width = -1;
-                        modified = CharT{};
-                    }
-                }
-                else
-                    read(is, *fmt);
-                break;
-            case '%':
-                if (command)
-                {
-                    if (modified == CharT{})
-                        read(is, *fmt);
-                    else
-                        read(is, CharT{'%'}, width, modified, *fmt);
-                    command = nullptr;
-                    width = -1;
-                    modified = CharT{};
-                }
-                else
-                    command = fmt;
-                break;
-            case 'z':
-                if (command)
-                {
-                    int tH, tM;
-                    minutes toff = not_a_offset;
-                    bool neg = false;
-                    auto ic = is.peek();
-                    if (!Traits::eq_int_type(ic, Traits::eof()))
-                    {
-                        auto c = static_cast<char>(Traits::to_char_type(ic));
-                        if (c == '-')
-                            neg = true;
-                    }
-                    if (modified == CharT{})
-                    {
-                        read(is, rs{tH, 2, 2});
-                        if (!is.fail())
-                            toff = hours{std::abs(tH)};
-                        if (is.good())
-                        {
-                            ic = is.peek();
-                            if (!Traits::eq_int_type(ic, Traits::eof()))
-                            {
-                                auto c = static_cast<char>(Traits::to_char_type(ic));
-                                if ('0' <= c && c <= '9')
-                                {
-                                    read(is, ru{tM, 2, 2});
-                                    if (!is.fail())
-                                        toff += minutes{tM};
-                                }
-                            }
-                        }
-                    }
-                    else
-                    {
-                        read(is, rs{tH, 1, 2});
-                        if (!is.fail())
-                            toff = hours{std::abs(tH)};
-                        if (is.good())
-                        {
-                            ic = is.peek();
-                            if (!Traits::eq_int_type(ic, Traits::eof()))
-                            {
-                                auto c = static_cast<char>(Traits::to_char_type(ic));
-                                if (c == ':')
-                                {
-                                    (void)is.get();
-                                    read(is, ru{tM, 2, 2});
-                                    if (!is.fail())
-                                        toff += minutes{tM};
-                                }
-                            }
-                        }
-                    }
-                    if (neg)
-                        toff = -toff;
-                    checked_set(temp_offset, toff, not_a_offset, is);
-                    command = nullptr;
-                    width = -1;
-                    modified = CharT{};
-                }
-                else
-                    read(is, *fmt);
-                break;
-            case 'Z':
-                if (command)
-                {
-                    if (modified == CharT{})
-                    {
-                        std::basic_string<CharT, Traits, Alloc> buf;
-                        while (is.rdstate() == std::ios::goodbit)
-                        {
-                            auto i = is.rdbuf()->sgetc();
-                            if (Traits::eq_int_type(i, Traits::eof()))
-                            {
-                                is.setstate(ios::eofbit);
-                                break;
-                            }
-                            auto wc = Traits::to_char_type(i);
-                            auto c = static_cast<char>(wc);
-                            // is c a valid time zone name or abbreviation character?
-                            if (!(CharT{1} < wc && wc < CharT{127}) || !(isalnum(c) ||
-                                    c == '_' || c == '/' || c == '-' || c == '+'))
-                                break;
-                            buf.push_back(c);
-                            is.rdbuf()->sbumpc();
-                        }
-                        if (buf.empty())
-                            is.setstate(ios::failbit);
-                        checked_set(temp_abbrev, buf, {}, is);
-                    }
-                    else
-                        read(is, CharT{'%'}, width, modified, *fmt);
-                    command = nullptr;
-                    width = -1;
-                    modified = CharT{};
-                }
-                else
-                    read(is, *fmt);
-                break;
-            default:
-                if (command)
-                {
-                    if (width == -1 && modified == CharT{} && '0' <= *fmt && *fmt <= '9')
-                    {
-                        width = static_cast<char>(*fmt) - '0';
-                        while ('0' <= fmt[1] && fmt[1] <= '9')
-                            width = 10*width + static_cast<char>(*++fmt) - '0';
-                    }
-                    else
-                    {
-                        if (modified == CharT{})
-                            read(is, CharT{'%'}, width, *fmt);
-                        else
-                            read(is, CharT{'%'}, width, modified, *fmt);
-                        command = nullptr;
-                        width = -1;
-                        modified = CharT{};
-                    }
-                }
-                else  // !command
-                {
-                    if (isspace(static_cast<unsigned char>(*fmt)))
-                    {
-                        // space matches 0 or more white space characters
-                        if (is.good())
-                           ws(is);
-                    }
-                    else
-                        read(is, *fmt);
-                }
-                break;
-            }
-        }
-        // is.fail() || *fmt == CharT{}
-        if (is.rdstate() == ios::goodbit && command)
-        {
-            if (modified == CharT{})
-                read(is, CharT{'%'}, width);
-            else
-                read(is, CharT{'%'}, width, modified);
-        }
-        if (!is.fail())
-        {
-            if (y != not_a_2digit_year)
-            {
-                // Convert y and an optional C to Y
-                if (!(0 <= y && y <= 99))
-                    goto broken;
-                if (C == not_a_century)
-                {
-                    if (Y == not_a_year)
-                    {
-                        if (y >= 69)
-                            C = 19;
-                        else
-                            C = 20;
-                    }
-                    else
-                    {
-                        C = (Y >= 0 ? Y : Y-100) / 100;
-                    }
-                }
-                int tY;
-                if (C >= 0)
-                    tY = 100*C + y;
-                else
-                    tY = 100*(C+1) - (y == 0 ? 100 : y);
-                if (Y != not_a_year && Y != tY)
-                    goto broken;
-                Y = tY;
-            }
-            if (g != not_a_2digit_year)
-            {
-                // Convert g and an optional C to G
-                if (!(0 <= g && g <= 99))
-                    goto broken;
-                if (C == not_a_century)
-                {
-                    if (G == not_a_year)
-                    {
-                        if (g >= 69)
-                            C = 19;
-                        else
-                            C = 20;
-                    }
-                    else
-                    {
-                        C = (G >= 0 ? G : G-100) / 100;
-                    }
-                }
-                int tG;
-                if (C >= 0)
-                    tG = 100*C + g;
-                else
-                    tG = 100*(C+1) - (g == 0 ? 100 : g);
-                if (G != not_a_year && G != tG)
-                    goto broken;
-                G = tG;
-            }
-            if (Y < static_cast<int>(year::min()) || Y > static_cast<int>(year::max()))
-                Y = not_a_year;
-            bool computed = false;
-            if (G != not_a_year && V != not_a_week_num && wd != not_a_weekday)
-            {
-                year_month_day ymd_trial = sys_days(year{G-1}/December/Thursday[last]) +
-                                           (Monday-Thursday) + weeks{V-1} +
-                                           (weekday{static_cast<unsigned>(wd)}-Monday);
-                if (Y == not_a_year)
-                    Y = static_cast<int>(ymd_trial.year());
-                else if (year{Y} != ymd_trial.year())
-                    goto broken;
-                if (m == not_a_month)
-                    m = static_cast<int>(static_cast<unsigned>(ymd_trial.month()));
-                else if (month(static_cast<unsigned>(m)) != ymd_trial.month())
-                    goto broken;
-                if (d == not_a_day)
-                    d = static_cast<int>(static_cast<unsigned>(ymd_trial.day()));
-                else if (day(static_cast<unsigned>(d)) != ymd_trial.day())
-                    goto broken;
-                computed = true;
-            }
-            if (Y != not_a_year && U != not_a_week_num && wd != not_a_weekday)
-            {
-                year_month_day ymd_trial = sys_days(year{Y}/January/Sunday[1]) +
-                                           weeks{U-1} +
-                                           (weekday{static_cast<unsigned>(wd)} - Sunday);
-                if (Y == not_a_year)
-                    Y = static_cast<int>(ymd_trial.year());
-                else if (year{Y} != ymd_trial.year())
-                    goto broken;
-                if (m == not_a_month)
-                    m = static_cast<int>(static_cast<unsigned>(ymd_trial.month()));
-                else if (month(static_cast<unsigned>(m)) != ymd_trial.month())
-                    goto broken;
-                if (d == not_a_day)
-                    d = static_cast<int>(static_cast<unsigned>(ymd_trial.day()));
-                else if (day(static_cast<unsigned>(d)) != ymd_trial.day())
-                    goto broken;
-                computed = true;
-            }
-            if (Y != not_a_year && W != not_a_week_num && wd != not_a_weekday)
-            {
-                year_month_day ymd_trial = sys_days(year{Y}/January/Monday[1]) +
-                                           weeks{W-1} +
-                                           (weekday{static_cast<unsigned>(wd)} - Monday);
-                if (Y == not_a_year)
-                    Y = static_cast<int>(ymd_trial.year());
-                else if (year{Y} != ymd_trial.year())
-                    goto broken;
-                if (m == not_a_month)
-                    m = static_cast<int>(static_cast<unsigned>(ymd_trial.month()));
-                else if (month(static_cast<unsigned>(m)) != ymd_trial.month())
-                    goto broken;
-                if (d == not_a_day)
-                    d = static_cast<int>(static_cast<unsigned>(ymd_trial.day()));
-                else if (day(static_cast<unsigned>(d)) != ymd_trial.day())
-                    goto broken;
-                computed = true;
-            }
-            if (j != not_a_doy && Y != not_a_year)
-            {
-                auto ymd_trial = year_month_day{local_days(year{Y}/1/1) + days{j-1}};
-                if (m == 0)
-                    m = static_cast<int>(static_cast<unsigned>(ymd_trial.month()));
-                else if (month(static_cast<unsigned>(m)) != ymd_trial.month())
-                    goto broken;
-                if (d == 0)
-                    d = static_cast<int>(static_cast<unsigned>(ymd_trial.day()));
-                else if (day(static_cast<unsigned>(d)) != ymd_trial.day())
-                    goto broken;
-                j = not_a_doy;
-            }
-            auto ymd = year{Y}/m/d;
-            if (ymd.ok())
-            {
-                if (wd == not_a_weekday)
-                    wd = static_cast<int>((weekday(sys_days(ymd)) - Sunday).count());
-                else if (wd != static_cast<int>((weekday(sys_days(ymd)) - Sunday).count()))
-                    goto broken;
-                if (!computed)
-                {
-                    if (G != not_a_year || V != not_a_week_num)
-                    {
-                        sys_days sd = ymd;
-                        auto G_trial = year_month_day{sd + days{3}}.year();
-                        auto start = sys_days((G_trial - years{1})/December/Thursday[last]) +
-                                     (Monday - Thursday);
-                        if (sd < start)
-                        {
-                            --G_trial;
-                            if (V != not_a_week_num)
-                                start = sys_days((G_trial - years{1})/December/Thursday[last])
-                                        + (Monday - Thursday);
-                        }
-                        if (G != not_a_year && G != static_cast<int>(G_trial))
-                            goto broken;
-                        if (V != not_a_week_num)
-                        {
-                            auto V_trial = duration_cast<weeks>(sd - start).count() + 1;
-                            if (V != V_trial)
-                                goto broken;
-                        }
-                    }
-                    if (U != not_a_week_num)
-                    {
-                        auto start = sys_days(Sunday[1]/January/ymd.year());
-                        auto U_trial = floor<weeks>(sys_days(ymd) - start).count() + 1;
-                        if (U != U_trial)
-                            goto broken;
-                    }
-                    if (W != not_a_week_num)
-                    {
-                        auto start = sys_days(Monday[1]/January/ymd.year());
-                        auto W_trial = floor<weeks>(sys_days(ymd) - start).count() + 1;
-                        if (W != W_trial)
-                            goto broken;
-                    }
-                }
-            }
-            fds.ymd = ymd;
-            if (I != not_a_hour_12_value)
-            {
-                if (!(1 <= I && I <= 12))
-                    goto broken;
-                if (p != not_a_ampm)
-                {
-                    // p is in [0, 1] == [AM, PM]
-                    // Store trial H in I
-                    if (I == 12)
-                        --p;
-                    I += p*12;
-                    // Either set H from I or make sure H and I are consistent
-                    if (H == not_a_hour)
-                        H = I;
-                    else if (I != H)
-                        goto broken;
-                }
-                else  // p == not_a_ampm
-                {
-                    // if H, make sure H and I could be consistent
-                    if (H != not_a_hour)
-                    {
-                        if (I == 12)
-                        {
-                            if (H != 0 && H != 12)
-                                goto broken;
-                        }
-                        else if (!(I == H || I == H+12))
-                        {
-                            goto broken;
-                        }
-                    }
-                }
-            }
-            if (H != not_a_hour)
-            {
-                fds.has_tod = true;
-                fds.tod = hh_mm_ss<Duration>{hours{H}};
-            }
-            if (M != not_a_minute)
-            {
-                fds.has_tod = true;
-                fds.tod.m_ = minutes{M};
-            }
-            if (s != not_a_second)
-            {
-                fds.has_tod = true;
-                fds.tod.s_ = detail::decimal_format_seconds<Duration>{s};
-            }
-            if (j != not_a_doy)
-            {
-                fds.has_tod = true;
-                fds.tod.h_ += hours{days{j}};
-            }
-            if (wd != not_a_weekday)
-                fds.wd = weekday{static_cast<unsigned>(wd)};
-            if (abbrev != nullptr)
-                *abbrev = std::move(temp_abbrev);
-            if (offset != nullptr && temp_offset != not_a_offset)
-              *offset = temp_offset;
-        }
-       return is;
-    }
-broken:
-    is.setstate(ios::failbit);
-    return is;
-}
-
-template <class CharT, class Traits, class Alloc = std::allocator<CharT>>
-std::basic_istream<CharT, Traits>&
-from_stream(std::basic_istream<CharT, Traits>& is, const CharT* fmt, year& y,
-            std::basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
-            std::chrono::minutes* offset = nullptr)
-{
-    using CT = std::chrono::seconds;
-    fields<CT> fds{};
-    from_stream(is, fmt, fds, abbrev, offset);
-    if (!fds.ymd.year().ok())
-        is.setstate(std::ios::failbit);
-    if (!is.fail())
-        y = fds.ymd.year();
-    return is;
-}
-
-template <class CharT, class Traits, class Alloc = std::allocator<CharT>>
-std::basic_istream<CharT, Traits>&
-from_stream(std::basic_istream<CharT, Traits>& is, const CharT* fmt, month& m,
-            std::basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
-            std::chrono::minutes* offset = nullptr)
-{
-    using CT = std::chrono::seconds;
-    fields<CT> fds{};
-    from_stream(is, fmt, fds, abbrev, offset);
-    if (!fds.ymd.month().ok())
-        is.setstate(std::ios::failbit);
-    if (!is.fail())
-        m = fds.ymd.month();
-    return is;
-}
-
-template <class CharT, class Traits, class Alloc = std::allocator<CharT>>
-std::basic_istream<CharT, Traits>&
-from_stream(std::basic_istream<CharT, Traits>& is, const CharT* fmt, day& d,
-            std::basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
-            std::chrono::minutes* offset = nullptr)
-{
-    using CT = std::chrono::seconds;
-    fields<CT> fds{};
-    from_stream(is, fmt, fds, abbrev, offset);
-    if (!fds.ymd.day().ok())
-        is.setstate(std::ios::failbit);
-    if (!is.fail())
-        d = fds.ymd.day();
-    return is;
-}
-
-template <class CharT, class Traits, class Alloc = std::allocator<CharT>>
-std::basic_istream<CharT, Traits>&
-from_stream(std::basic_istream<CharT, Traits>& is, const CharT* fmt, weekday& wd,
-            std::basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
-            std::chrono::minutes* offset = nullptr)
-{
-    using CT = std::chrono::seconds;
-    fields<CT> fds{};
-    from_stream(is, fmt, fds, abbrev, offset);
-    if (!fds.wd.ok())
-        is.setstate(std::ios::failbit);
-    if (!is.fail())
-        wd = fds.wd;
-    return is;
-}
-
-template <class CharT, class Traits, class Alloc = std::allocator<CharT>>
-std::basic_istream<CharT, Traits>&
-from_stream(std::basic_istream<CharT, Traits>& is, const CharT* fmt, year_month& ym,
-            std::basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
-            std::chrono::minutes* offset = nullptr)
-{
-    using CT = std::chrono::seconds;
-    fields<CT> fds{};
-    from_stream(is, fmt, fds, abbrev, offset);
-    if (!fds.ymd.month().ok())
-        is.setstate(std::ios::failbit);
-    if (!is.fail())
-        ym = fds.ymd.year()/fds.ymd.month();
-    return is;
-}
-
-template <class CharT, class Traits, class Alloc = std::allocator<CharT>>
-std::basic_istream<CharT, Traits>&
-from_stream(std::basic_istream<CharT, Traits>& is, const CharT* fmt, month_day& md,
-            std::basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
-            std::chrono::minutes* offset = nullptr)
-{
-    using CT = std::chrono::seconds;
-    fields<CT> fds{};
-    from_stream(is, fmt, fds, abbrev, offset);
-    if (!fds.ymd.month().ok() || !fds.ymd.day().ok())
-        is.setstate(std::ios::failbit);
-    if (!is.fail())
-        md = fds.ymd.month()/fds.ymd.day();
-    return is;
-}
-
-template <class CharT, class Traits, class Alloc = std::allocator<CharT>>
-std::basic_istream<CharT, Traits>&
-from_stream(std::basic_istream<CharT, Traits>& is, const CharT* fmt,
-            year_month_day& ymd, std::basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
-            std::chrono::minutes* offset = nullptr)
-{
-    using CT = std::chrono::seconds;
-    fields<CT> fds{};
-    from_stream(is, fmt, fds, abbrev, offset);
-    if (!fds.ymd.ok())
-        is.setstate(std::ios::failbit);
-    if (!is.fail())
-        ymd = fds.ymd;
-    return is;
-}
-
-template <class Duration, class CharT, class Traits, class Alloc = std::allocator<CharT>>
-std::basic_istream<CharT, Traits>&
-from_stream(std::basic_istream<CharT, Traits>& is, const CharT* fmt,
-            sys_time<Duration>& tp, std::basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
-            std::chrono::minutes* offset = nullptr)
-{
-    using CT = typename std::common_type<Duration, std::chrono::seconds>::type;
-    std::chrono::minutes offset_local{};
-    auto offptr = offset ? offset : &offset_local;
-    fields<CT> fds{};
-    fds.has_tod = true;
-    from_stream(is, fmt, fds, abbrev, offptr);
-    if (!fds.ymd.ok() || !fds.tod.in_conventional_range())
-        is.setstate(std::ios::failbit);
-    if (!is.fail())
-        tp = round<Duration>(sys_days(fds.ymd) - *offptr + fds.tod.to_duration());
-    return is;
-}
-
-template <class Duration, class CharT, class Traits, class Alloc = std::allocator<CharT>>
-std::basic_istream<CharT, Traits>&
-from_stream(std::basic_istream<CharT, Traits>& is, const CharT* fmt,
-            local_time<Duration>& tp, std::basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
-            std::chrono::minutes* offset = nullptr)
-{
-    using CT = typename std::common_type<Duration, std::chrono::seconds>::type;
-    fields<CT> fds{};
-    fds.has_tod = true;
-    from_stream(is, fmt, fds, abbrev, offset);
-    if (!fds.ymd.ok() || !fds.tod.in_conventional_range())
-        is.setstate(std::ios::failbit);
-    if (!is.fail())
-        tp = round<Duration>(local_seconds{local_days(fds.ymd)} + fds.tod.to_duration());
-    return is;
-}
-
-template <class Rep, class Period, class CharT, class Traits, class Alloc = std::allocator<CharT>>
-std::basic_istream<CharT, Traits>&
-from_stream(std::basic_istream<CharT, Traits>& is, const CharT* fmt,
-            std::chrono::duration<Rep, Period>& d,
-            std::basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
-            std::chrono::minutes* offset = nullptr)
-{
-    using Duration = std::chrono::duration<Rep, Period>;
-    using CT = typename std::common_type<Duration, std::chrono::seconds>::type;
-    fields<CT> fds{};
-    from_stream(is, fmt, fds, abbrev, offset);
-    if (!fds.has_tod)
-        is.setstate(std::ios::failbit);
-    if (!is.fail())
-        d = std::chrono::duration_cast<Duration>(fds.tod.to_duration());
-    return is;
-}
-
-template <class Parsable, class CharT, class Traits = std::char_traits<CharT>,
-          class Alloc = std::allocator<CharT>>
-struct parse_manip
-{
-    const std::basic_string<CharT, Traits, Alloc> format_;
-    Parsable&                                     tp_;
-    std::basic_string<CharT, Traits, Alloc>*      abbrev_;
-    std::chrono::minutes*                         offset_;
-
-public:
-    parse_manip(std::basic_string<CharT, Traits, Alloc> format, Parsable& tp,
-                std::basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
-                std::chrono::minutes* offset = nullptr)
-        : format_(std::move(format))
-        , tp_(tp)
-        , abbrev_(abbrev)
-        , offset_(offset)
-        {}
-
-};
-
-template <class Parsable, class CharT, class Traits, class Alloc>
-std::basic_istream<CharT, Traits>&
-operator>>(std::basic_istream<CharT, Traits>& is,
-           const parse_manip<Parsable, CharT, Traits, Alloc>& x)
-{
-    return from_stream(is, x.format_.c_str(), x.tp_, x.abbrev_, x.offset_);
-}
-
-template <class Parsable, class CharT, class Traits, class Alloc>
-inline
-auto
-parse(const std::basic_string<CharT, Traits, Alloc>& format, Parsable& tp)
-    -> decltype(from_stream(std::declval<std::basic_istream<CharT, Traits>&>(),
-                            format.c_str(), tp),
-                parse_manip<Parsable, CharT, Traits, Alloc>{format, tp})
-{
-    return {format, tp};
-}
-
-template <class Parsable, class CharT, class Traits, class Alloc>
-inline
-auto
-parse(const std::basic_string<CharT, Traits, Alloc>& format, Parsable& tp,
-      std::basic_string<CharT, Traits, Alloc>& abbrev)
-    -> decltype(from_stream(std::declval<std::basic_istream<CharT, Traits>&>(),
-                            format.c_str(), tp, &abbrev),
-                parse_manip<Parsable, CharT, Traits, Alloc>{format, tp, &abbrev})
-{
-    return {format, tp, &abbrev};
-}
-
-template <class Parsable, class CharT, class Traits, class Alloc>
-inline
-auto
-parse(const std::basic_string<CharT, Traits, Alloc>& format, Parsable& tp,
-      std::chrono::minutes& offset)
-    -> decltype(from_stream(std::declval<std::basic_istream<CharT, Traits>&>(),
-                            format.c_str(), tp,
-                            std::declval<std::basic_string<CharT, Traits, Alloc>*>(),
-                            &offset),
-                parse_manip<Parsable, CharT, Traits, Alloc>{format, tp, nullptr, &offset})
-{
-    return {format, tp, nullptr, &offset};
-}
-
-template <class Parsable, class CharT, class Traits, class Alloc>
-inline
-auto
-parse(const std::basic_string<CharT, Traits, Alloc>& format, Parsable& tp,
-      std::basic_string<CharT, Traits, Alloc>& abbrev, std::chrono::minutes& offset)
-    -> decltype(from_stream(std::declval<std::basic_istream<CharT, Traits>&>(),
-                            format.c_str(), tp, &abbrev, &offset),
-                parse_manip<Parsable, CharT, Traits, Alloc>{format, tp, &abbrev, &offset})
-{
-    return {format, tp, &abbrev, &offset};
-}
-
-// const CharT* formats
-
-template <class Parsable, class CharT>
-inline
-auto
-parse(const CharT* format, Parsable& tp)
-    -> decltype(from_stream(std::declval<std::basic_istream<CharT>&>(), format, tp),
-                parse_manip<Parsable, CharT>{format, tp})
-{
-    return {format, tp};
-}
-
-template <class Parsable, class CharT, class Traits, class Alloc>
-inline
-auto
-parse(const CharT* format, Parsable& tp, std::basic_string<CharT, Traits, Alloc>& abbrev)
-    -> decltype(from_stream(std::declval<std::basic_istream<CharT, Traits>&>(), format,
-                            tp, &abbrev),
-                parse_manip<Parsable, CharT, Traits, Alloc>{format, tp, &abbrev})
-{
-    return {format, tp, &abbrev};
-}
-
-template <class Parsable, class CharT>
-inline
-auto
-parse(const CharT* format, Parsable& tp, std::chrono::minutes& offset)
-    -> decltype(from_stream(std::declval<std::basic_istream<CharT>&>(), format,
-                            tp, std::declval<std::basic_string<CharT>*>(), &offset),
-                parse_manip<Parsable, CharT>{format, tp, nullptr, &offset})
-{
-    return {format, tp, nullptr, &offset};
-}
-
-template <class Parsable, class CharT, class Traits, class Alloc>
-inline
-auto
-parse(const CharT* format, Parsable& tp,
-      std::basic_string<CharT, Traits, Alloc>& abbrev, std::chrono::minutes& offset)
-    -> decltype(from_stream(std::declval<std::basic_istream<CharT, Traits>&>(), format,
-                            tp, &abbrev, &offset),
-                parse_manip<Parsable, CharT, Traits, Alloc>{format, tp, &abbrev, &offset})
-{
-    return {format, tp, &abbrev, &offset};
-}
-
-// duration streaming
-
-template <class CharT, class Traits, class Rep, class Period>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os,
-           const std::chrono::duration<Rep, Period>& d)
-{
-    return os << detail::make_string<CharT, Traits>::from(d.count()) +
-                 detail::get_units<CharT>(typename Period::type{});
-}
-
-}  // namespace date
-
-#ifdef _MSC_VER
-#   pragma warning(pop)
-#endif
-
-#ifdef __GNUC__
-# pragma GCC diagnostic pop
-#endif
-
-#endif  // DATE_H




diff --git a/src/libs/date/includes/date/ios.h b/src/libs/date/includes/date/ios.h
deleted file mode 100644
index ee54b9d084cd2bca7d817d6ff92968b84eda9516..0000000000000000000000000000000000000000
--- a/src/libs/date/includes/date/ios.h
+++ /dev/null
@@ -1,50 +0,0 @@
-//
-//  ios.h
-//  DateTimeLib
-//
-// The MIT License (MIT)
-//
-// Copyright (c) 2016 Alexander Kormanovsky
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-#ifndef ios_hpp
-#define ios_hpp
-
-#if __APPLE__
-# include <TargetConditionals.h>
-# if TARGET_OS_IPHONE
-#   include <string>
-
-    namespace date
-    {
-    namespace iOSUtils
-    {
-    
-    std::string get_tzdata_path();
-    std::string get_current_timezone();
-    
-    }  // namespace iOSUtils
-    }  // namespace date
-
-# endif  // TARGET_OS_IPHONE
-#else   // !__APPLE__
-# define TARGET_OS_IPHONE 0
-#endif  // !__APPLE__
-#endif // ios_hpp




diff --git a/src/libs/date/includes/date/islamic.h b/src/libs/date/includes/date/islamic.h
deleted file mode 100644
index 82ed6597b0b3bc571bb6ae4809fceb87f5ffa2f5..0000000000000000000000000000000000000000
--- a/src/libs/date/includes/date/islamic.h
+++ /dev/null
@@ -1,3031 +0,0 @@
-#ifndef ISLAMIC_H
-#define ISLAMIC_H
-
-// The MIT License (MIT)
-//
-// Copyright (c) 2016 Howard Hinnant
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-//
-// Our apologies.  When the previous paragraph was written, lowercase had not yet
-// been invented (that would involve another several millennia of evolution).
-// We did not mean to shout.
-
-#include "date.h"
-
-namespace islamic
-{
-
-// durations
-
-using days = date::days;
-
-using weeks = date::weeks;
-
-using years = std::chrono::duration
-    <int, date::detail::ratio_multiply<std::ratio<10631, 30>, days::period>>;
-
-using months = std::chrono::duration
-    <int, date::detail::ratio_divide<years::period, std::ratio<12>>>;
-
-// time_point
-
-using sys_days   = date::sys_days;
-using local_days = date::local_days;
-
-// types
-
-struct last_spec
-{
-    explicit last_spec() = default;
-};
-
-class day;
-class month;
-class year;
-
-class weekday;
-class weekday_indexed;
-class weekday_last;
-
-class month_day;
-class month_day_last;
-class month_weekday;
-class month_weekday_last;
-
-class year_month;
-
-class year_month_day;
-class year_month_day_last;
-class year_month_weekday;
-class year_month_weekday_last;
-
-// date composition operators
-
-CONSTCD11 year_month operator/(const year& y, const month& m) NOEXCEPT;
-CONSTCD11 year_month operator/(const year& y, int          m) NOEXCEPT;
-
-CONSTCD11 month_day operator/(const day& d, const month& m) NOEXCEPT;
-CONSTCD11 month_day operator/(const day& d, int          m) NOEXCEPT;
-CONSTCD11 month_day operator/(const month& m, const day& d) NOEXCEPT;
-CONSTCD11 month_day operator/(const month& m, int        d) NOEXCEPT;
-CONSTCD11 month_day operator/(int          m, const day& d) NOEXCEPT;
-
-CONSTCD11 month_day_last operator/(const month& m, last_spec) NOEXCEPT;
-CONSTCD11 month_day_last operator/(int          m, last_spec) NOEXCEPT;
-CONSTCD11 month_day_last operator/(last_spec, const month& m) NOEXCEPT;
-CONSTCD11 month_day_last operator/(last_spec, int          m) NOEXCEPT;
-
-CONSTCD11 month_weekday operator/(const month& m, const weekday_indexed& wdi) NOEXCEPT;
-CONSTCD11 month_weekday operator/(int          m, const weekday_indexed& wdi) NOEXCEPT;
-CONSTCD11 month_weekday operator/(const weekday_indexed& wdi, const month& m) NOEXCEPT;
-CONSTCD11 month_weekday operator/(const weekday_indexed& wdi, int          m) NOEXCEPT;
-
-CONSTCD11 month_weekday_last operator/(const month& m, const weekday_last& wdl) NOEXCEPT;
-CONSTCD11 month_weekday_last operator/(int          m, const weekday_last& wdl) NOEXCEPT;
-CONSTCD11 month_weekday_last operator/(const weekday_last& wdl, const month& m) NOEXCEPT;
-CONSTCD11 month_weekday_last operator/(const weekday_last& wdl, int          m) NOEXCEPT;
-
-CONSTCD11 year_month_day operator/(const year_month& ym, const day& d) NOEXCEPT;
-CONSTCD11 year_month_day operator/(const year_month& ym, int        d) NOEXCEPT;
-CONSTCD11 year_month_day operator/(const year& y, const month_day& md) NOEXCEPT;
-CONSTCD11 year_month_day operator/(int         y, const month_day& md) NOEXCEPT;
-CONSTCD11 year_month_day operator/(const month_day& md, const year& y) NOEXCEPT;
-CONSTCD11 year_month_day operator/(const month_day& md, int         y) NOEXCEPT;
-
-CONSTCD11
-    year_month_day_last operator/(const year_month& ym,   last_spec) NOEXCEPT;
-CONSTCD11
-    year_month_day_last operator/(const year& y, const month_day_last& mdl) NOEXCEPT;
-CONSTCD11
-    year_month_day_last operator/(int         y, const month_day_last& mdl) NOEXCEPT;
-CONSTCD11
-    year_month_day_last operator/(const month_day_last& mdl, const year& y) NOEXCEPT;
-CONSTCD11
-    year_month_day_last operator/(const month_day_last& mdl, int         y) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator/(const year_month& ym, const weekday_indexed& wdi) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator/(const year&        y, const month_weekday&   mwd) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator/(int                y, const month_weekday&   mwd) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator/(const month_weekday& mwd, const year&          y) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator/(const month_weekday& mwd, int                  y) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator/(const year_month& ym, const weekday_last& wdl) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator/(const year& y, const month_weekday_last& mwdl) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator/(int         y, const month_weekday_last& mwdl) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator/(const month_weekday_last& mwdl, const year& y) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator/(const month_weekday_last& mwdl, int         y) NOEXCEPT;
-
-// Detailed interface
-
-// day
-
-class day
-{
-    unsigned char d_;
-
-public:
-    explicit CONSTCD11 day(unsigned d) NOEXCEPT;
-
-    CONSTCD14 day& operator++()    NOEXCEPT;
-    CONSTCD14 day  operator++(int) NOEXCEPT;
-    CONSTCD14 day& operator--()    NOEXCEPT;
-    CONSTCD14 day  operator--(int) NOEXCEPT;
-
-    CONSTCD14 day& operator+=(const days& d) NOEXCEPT;
-    CONSTCD14 day& operator-=(const days& d) NOEXCEPT;
-
-    CONSTCD11 explicit operator unsigned() const NOEXCEPT;
-    CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const day& x, const day& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const day& x, const day& y) NOEXCEPT;
-CONSTCD11 bool operator< (const day& x, const day& y) NOEXCEPT;
-CONSTCD11 bool operator> (const day& x, const day& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const day& x, const day& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const day& x, const day& y) NOEXCEPT;
-
-CONSTCD11 day  operator+(const day&  x, const days& y) NOEXCEPT;
-CONSTCD11 day  operator+(const days& x, const day&  y) NOEXCEPT;
-CONSTCD11 day  operator-(const day&  x, const days& y) NOEXCEPT;
-CONSTCD11 days operator-(const day&  x, const day&  y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const day& d);
-
-// month
-
-class month
-{
-    unsigned char m_;
-
-public:
-    explicit CONSTCD11 month(unsigned m) NOEXCEPT;
-
-    CONSTCD14 month& operator++()    NOEXCEPT;
-    CONSTCD14 month  operator++(int) NOEXCEPT;
-    CONSTCD14 month& operator--()    NOEXCEPT;
-    CONSTCD14 month  operator--(int) NOEXCEPT;
-
-    CONSTCD14 month& operator+=(const months& m) NOEXCEPT;
-    CONSTCD14 month& operator-=(const months& m) NOEXCEPT;
-
-    CONSTCD11 explicit operator unsigned() const NOEXCEPT;
-    CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const month& x, const month& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const month& x, const month& y) NOEXCEPT;
-CONSTCD11 bool operator< (const month& x, const month& y) NOEXCEPT;
-CONSTCD11 bool operator> (const month& x, const month& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const month& x, const month& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const month& x, const month& y) NOEXCEPT;
-
-CONSTCD14 month  operator+(const month&  x, const months& y) NOEXCEPT;
-CONSTCD14 month  operator+(const months& x,  const month& y) NOEXCEPT;
-CONSTCD14 month  operator-(const month&  x, const months& y) NOEXCEPT;
-CONSTCD14 months operator-(const month&  x,  const month& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month& m);
-
-// year
-
-class year
-{
-    short y_;
-
-public:
-    explicit CONSTCD11 year(int y) NOEXCEPT;
-
-    CONSTCD14 year& operator++()    NOEXCEPT;
-    CONSTCD14 year  operator++(int) NOEXCEPT;
-    CONSTCD14 year& operator--()    NOEXCEPT;
-    CONSTCD14 year  operator--(int) NOEXCEPT;
-
-    CONSTCD14 year& operator+=(const years& y) NOEXCEPT;
-    CONSTCD14 year& operator-=(const years& y) NOEXCEPT;
-
-    CONSTCD14 bool is_leap() const NOEXCEPT;
-
-    CONSTCD11 explicit operator int() const NOEXCEPT;
-    CONSTCD11 bool ok() const NOEXCEPT;
-
-    static CONSTCD11 year min() NOEXCEPT;
-    static CONSTCD11 year max() NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator< (const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator> (const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const year& x, const year& y) NOEXCEPT;
-
-CONSTCD11 year  operator+(const year&  x, const years& y) NOEXCEPT;
-CONSTCD11 year  operator+(const years& x, const year&  y) NOEXCEPT;
-CONSTCD11 year  operator-(const year&  x, const years& y) NOEXCEPT;
-CONSTCD11 years operator-(const year&  x, const year&  y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year& y);
-
-// weekday
-
-class weekday
-{
-    unsigned char wd_;
-public:
-    explicit CONSTCD11 weekday(unsigned wd) NOEXCEPT;
-    explicit weekday(int) = delete;
-    CONSTCD11 weekday(const sys_days& dp) NOEXCEPT;
-    CONSTCD11 explicit weekday(const local_days& dp) NOEXCEPT;
-
-    CONSTCD14 weekday& operator++()    NOEXCEPT;
-    CONSTCD14 weekday  operator++(int) NOEXCEPT;
-    CONSTCD14 weekday& operator--()    NOEXCEPT;
-    CONSTCD14 weekday  operator--(int) NOEXCEPT;
-
-    CONSTCD14 weekday& operator+=(const days& d) NOEXCEPT;
-    CONSTCD14 weekday& operator-=(const days& d) NOEXCEPT;
-
-    CONSTCD11 explicit operator unsigned() const NOEXCEPT;
-    CONSTCD11 bool ok() const NOEXCEPT;
-
-    CONSTCD11 weekday_indexed operator[](unsigned index) const NOEXCEPT;
-    CONSTCD11 weekday_last    operator[](last_spec)      const NOEXCEPT;
-
-private:
-    static CONSTCD11 unsigned char weekday_from_days(int z) NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const weekday& x, const weekday& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const weekday& x, const weekday& y) NOEXCEPT;
-
-CONSTCD14 weekday operator+(const weekday& x, const days&    y) NOEXCEPT;
-CONSTCD14 weekday operator+(const days&    x, const weekday& y) NOEXCEPT;
-CONSTCD14 weekday operator-(const weekday& x, const days&    y) NOEXCEPT;
-CONSTCD14 days    operator-(const weekday& x, const weekday& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday& wd);
-
-// weekday_indexed
-
-class weekday_indexed
-{
-    unsigned char wd_    : 4;
-    unsigned char index_ : 4;
-
-public:
-    CONSTCD11 weekday_indexed(const islamic::weekday& wd, unsigned index) NOEXCEPT;
-
-    CONSTCD11 islamic::weekday weekday() const NOEXCEPT;
-    CONSTCD11 unsigned index() const NOEXCEPT;
-    CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday_indexed& wdi);
-
-// weekday_last
-
-class weekday_last
-{
-    islamic::weekday wd_;
-
-public:
-    explicit CONSTCD11 weekday_last(const islamic::weekday& wd) NOEXCEPT;
-
-    CONSTCD11 islamic::weekday weekday() const NOEXCEPT;
-    CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const weekday_last& x, const weekday_last& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const weekday_last& x, const weekday_last& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday_last& wdl);
-
-// year_month
-
-class year_month
-{
-    islamic::year  y_;
-    islamic::month m_;
-
-public:
-    CONSTCD11 year_month(const islamic::year& y, const islamic::month& m) NOEXCEPT;
-
-    CONSTCD11 islamic::year  year()  const NOEXCEPT;
-    CONSTCD11 islamic::month month() const NOEXCEPT;
-
-    CONSTCD14 year_month& operator+=(const months& dm) NOEXCEPT;
-    CONSTCD14 year_month& operator-=(const months& dm) NOEXCEPT;
-    CONSTCD14 year_month& operator+=(const years& dy) NOEXCEPT;
-    CONSTCD14 year_month& operator-=(const years& dy) NOEXCEPT;
-
-    CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const year_month& x, const year_month& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const year_month& x, const year_month& y) NOEXCEPT;
-CONSTCD11 bool operator< (const year_month& x, const year_month& y) NOEXCEPT;
-CONSTCD11 bool operator> (const year_month& x, const year_month& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const year_month& x, const year_month& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const year_month& x, const year_month& y) NOEXCEPT;
-
-CONSTCD14 year_month operator+(const year_month& ym, const months& dm) NOEXCEPT;
-CONSTCD14 year_month operator+(const months& dm, const year_month& ym) NOEXCEPT;
-CONSTCD14 year_month operator-(const year_month& ym, const months& dm) NOEXCEPT;
-
-CONSTCD11 months operator-(const year_month& x, const year_month& y) NOEXCEPT;
-CONSTCD11 year_month operator+(const year_month& ym, const years& dy) NOEXCEPT;
-CONSTCD11 year_month operator+(const years& dy, const year_month& ym) NOEXCEPT;
-CONSTCD11 year_month operator-(const year_month& ym, const years& dy) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month& ym);
-
-// month_day
-
-class month_day
-{
-    islamic::month m_;
-    islamic::day   d_;
-
-public:
-    CONSTCD11 month_day(const islamic::month& m, const islamic::day& d) NOEXCEPT;
-
-    CONSTCD11 islamic::month month() const NOEXCEPT;
-    CONSTCD11 islamic::day   day() const NOEXCEPT;
-
-    CONSTCD14 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const month_day& x, const month_day& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const month_day& x, const month_day& y) NOEXCEPT;
-CONSTCD11 bool operator< (const month_day& x, const month_day& y) NOEXCEPT;
-CONSTCD11 bool operator> (const month_day& x, const month_day& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const month_day& x, const month_day& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const month_day& x, const month_day& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_day& md);
-
-// month_day_last
-
-class month_day_last
-{
-    islamic::month m_;
-
-public:
-    CONSTCD11 explicit month_day_last(const islamic::month& m) NOEXCEPT;
-
-    CONSTCD11 islamic::month month() const NOEXCEPT;
-    CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const month_day_last& x, const month_day_last& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const month_day_last& x, const month_day_last& y) NOEXCEPT;
-CONSTCD11 bool operator< (const month_day_last& x, const month_day_last& y) NOEXCEPT;
-CONSTCD11 bool operator> (const month_day_last& x, const month_day_last& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const month_day_last& x, const month_day_last& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const month_day_last& x, const month_day_last& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_day_last& mdl);
-
-// month_weekday
-
-class month_weekday
-{
-    islamic::month           m_;
-    islamic::weekday_indexed wdi_;
-public:
-    CONSTCD11 month_weekday(const islamic::month& m,
-                            const islamic::weekday_indexed& wdi) NOEXCEPT;
-
-    CONSTCD11 islamic::month           month()           const NOEXCEPT;
-    CONSTCD11 islamic::weekday_indexed weekday_indexed() const NOEXCEPT;
-
-    CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const month_weekday& x, const month_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const month_weekday& x, const month_weekday& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_weekday& mwd);
-
-// month_weekday_last
-
-class month_weekday_last
-{
-    islamic::month        m_;
-    islamic::weekday_last wdl_;
-
-public:
-    CONSTCD11 month_weekday_last(const islamic::month& m,
-                                 const islamic::weekday_last& wd) NOEXCEPT;
-
-    CONSTCD11 islamic::month        month()        const NOEXCEPT;
-    CONSTCD11 islamic::weekday_last weekday_last() const NOEXCEPT;
-
-    CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11
-    bool operator==(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT;
-CONSTCD11
-    bool operator!=(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_weekday_last& mwdl);
-
-// class year_month_day
-
-class year_month_day
-{
-    islamic::year  y_;
-    islamic::month m_;
-    islamic::day   d_;
-
-public:
-    CONSTCD11 year_month_day(const islamic::year& y, const islamic::month& m,
-                             const islamic::day& d) NOEXCEPT;
-    CONSTCD14 year_month_day(const year_month_day_last& ymdl) NOEXCEPT;
-
-    CONSTCD14 year_month_day(sys_days dp) NOEXCEPT;
-    CONSTCD14 explicit year_month_day(local_days dp) NOEXCEPT;
-
-    CONSTCD14 year_month_day& operator+=(const months& m) NOEXCEPT;
-    CONSTCD14 year_month_day& operator-=(const months& m) NOEXCEPT;
-    CONSTCD14 year_month_day& operator+=(const years& y)  NOEXCEPT;
-    CONSTCD14 year_month_day& operator-=(const years& y)  NOEXCEPT;
-
-    CONSTCD11 islamic::year  year()  const NOEXCEPT;
-    CONSTCD11 islamic::month month() const NOEXCEPT;
-    CONSTCD11 islamic::day   day()   const NOEXCEPT;
-
-    CONSTCD14 operator sys_days() const NOEXCEPT;
-    CONSTCD14 explicit operator local_days() const NOEXCEPT;
-    CONSTCD14 bool ok() const NOEXCEPT;
-
-private:
-    static CONSTCD14 year_month_day from_days(days dp) NOEXCEPT;
-    CONSTCD14 days to_days() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const year_month_day& x, const year_month_day& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const year_month_day& x, const year_month_day& y) NOEXCEPT;
-CONSTCD11 bool operator< (const year_month_day& x, const year_month_day& y) NOEXCEPT;
-CONSTCD11 bool operator> (const year_month_day& x, const year_month_day& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const year_month_day& x, const year_month_day& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const year_month_day& x, const year_month_day& y) NOEXCEPT;
-
-CONSTCD14 year_month_day operator+(const year_month_day& ymd, const months& dm) NOEXCEPT;
-CONSTCD14 year_month_day operator+(const months& dm, const year_month_day& ymd) NOEXCEPT;
-CONSTCD14 year_month_day operator-(const year_month_day& ymd, const months& dm) NOEXCEPT;
-CONSTCD11 year_month_day operator+(const year_month_day& ymd, const years& dy)  NOEXCEPT;
-CONSTCD11 year_month_day operator+(const years& dy, const year_month_day& ymd)  NOEXCEPT;
-CONSTCD11 year_month_day operator-(const year_month_day& ymd, const years& dy)  NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_day& ymd);
-
-// year_month_day_last
-
-class year_month_day_last
-{
-    islamic::year           y_;
-    islamic::month_day_last mdl_;
-
-public:
-    CONSTCD11 year_month_day_last(const islamic::year& y,
-                                  const islamic::month_day_last& mdl) NOEXCEPT;
-
-    CONSTCD14 year_month_day_last& operator+=(const months& m) NOEXCEPT;
-    CONSTCD14 year_month_day_last& operator-=(const months& m) NOEXCEPT;
-    CONSTCD14 year_month_day_last& operator+=(const years& y)  NOEXCEPT;
-    CONSTCD14 year_month_day_last& operator-=(const years& y)  NOEXCEPT;
-
-    CONSTCD11 islamic::year           year()           const NOEXCEPT;
-    CONSTCD11 islamic::month          month()          const NOEXCEPT;
-    CONSTCD11 islamic::month_day_last month_day_last() const NOEXCEPT;
-    CONSTCD14 islamic::day            day()            const NOEXCEPT;
-
-    CONSTCD14 operator sys_days() const NOEXCEPT;
-    CONSTCD14 explicit operator local_days() const NOEXCEPT;
-    CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11
-    bool operator==(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT;
-CONSTCD11
-    bool operator!=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT;
-CONSTCD11
-    bool operator< (const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT;
-CONSTCD11
-    bool operator> (const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT;
-CONSTCD11
-    bool operator<=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT;
-CONSTCD11
-    bool operator>=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT;
-
-CONSTCD14
-year_month_day_last
-operator+(const year_month_day_last& ymdl, const months& dm) NOEXCEPT;
-
-CONSTCD14
-year_month_day_last
-operator+(const months& dm, const year_month_day_last& ymdl) NOEXCEPT;
-
-CONSTCD11
-year_month_day_last
-operator+(const year_month_day_last& ymdl, const years& dy) NOEXCEPT;
-
-CONSTCD11
-year_month_day_last
-operator+(const years& dy, const year_month_day_last& ymdl) NOEXCEPT;
-
-CONSTCD14
-year_month_day_last
-operator-(const year_month_day_last& ymdl, const months& dm) NOEXCEPT;
-
-CONSTCD11
-year_month_day_last
-operator-(const year_month_day_last& ymdl, const years& dy) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_day_last& ymdl);
-
-// year_month_weekday
-
-class year_month_weekday
-{
-    islamic::year            y_;
-    islamic::month           m_;
-    islamic::weekday_indexed wdi_;
-
-public:
-    CONSTCD11 year_month_weekday(const islamic::year& y, const islamic::month& m,
-                                   const islamic::weekday_indexed& wdi) NOEXCEPT;
-    CONSTCD14 year_month_weekday(const sys_days& dp) NOEXCEPT;
-    CONSTCD14 explicit year_month_weekday(const local_days& dp) NOEXCEPT;
-
-    CONSTCD14 year_month_weekday& operator+=(const months& m) NOEXCEPT;
-    CONSTCD14 year_month_weekday& operator-=(const months& m) NOEXCEPT;
-    CONSTCD14 year_month_weekday& operator+=(const years& y)  NOEXCEPT;
-    CONSTCD14 year_month_weekday& operator-=(const years& y)  NOEXCEPT;
-
-    CONSTCD11 islamic::year year() const NOEXCEPT;
-    CONSTCD11 islamic::month month() const NOEXCEPT;
-    CONSTCD11 islamic::weekday weekday() const NOEXCEPT;
-    CONSTCD11 unsigned index() const NOEXCEPT;
-    CONSTCD11 islamic::weekday_indexed weekday_indexed() const NOEXCEPT;
-
-    CONSTCD14 operator sys_days() const NOEXCEPT;
-    CONSTCD14 explicit operator local_days() const NOEXCEPT;
-    CONSTCD14 bool ok() const NOEXCEPT;
-
-private:
-    static CONSTCD14 year_month_weekday from_days(days dp) NOEXCEPT;
-    CONSTCD14 days to_days() const NOEXCEPT;
-};
-
-CONSTCD11
-    bool operator==(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT;
-CONSTCD11
-    bool operator!=(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT;
-
-CONSTCD14
-year_month_weekday
-operator+(const year_month_weekday& ymwd, const months& dm) NOEXCEPT;
-
-CONSTCD14
-year_month_weekday
-operator+(const months& dm, const year_month_weekday& ymwd) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator+(const year_month_weekday& ymwd, const years& dy) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator+(const years& dy, const year_month_weekday& ymwd) NOEXCEPT;
-
-CONSTCD14
-year_month_weekday
-operator-(const year_month_weekday& ymwd, const months& dm) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator-(const year_month_weekday& ymwd, const years& dy) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_weekday& ymwdi);
-
-// year_month_weekday_last
-
-class year_month_weekday_last
-{
-    islamic::year y_;
-    islamic::month m_;
-    islamic::weekday_last wdl_;
-
-public:
-    CONSTCD11 year_month_weekday_last(const islamic::year& y, const islamic::month& m,
-                                      const islamic::weekday_last& wdl) NOEXCEPT;
-
-    CONSTCD14 year_month_weekday_last& operator+=(const months& m) NOEXCEPT;
-    CONSTCD14 year_month_weekday_last& operator-=(const months& m) NOEXCEPT;
-    CONSTCD14 year_month_weekday_last& operator+=(const years& y) NOEXCEPT;
-    CONSTCD14 year_month_weekday_last& operator-=(const years& y) NOEXCEPT;
-
-    CONSTCD11 islamic::year year() const NOEXCEPT;
-    CONSTCD11 islamic::month month() const NOEXCEPT;
-    CONSTCD11 islamic::weekday weekday() const NOEXCEPT;
-    CONSTCD11 islamic::weekday_last weekday_last() const NOEXCEPT;
-
-    CONSTCD14 operator sys_days() const NOEXCEPT;
-    CONSTCD14 explicit operator local_days() const NOEXCEPT;
-    CONSTCD11 bool ok() const NOEXCEPT;
-
-private:
-    CONSTCD14 days to_days() const NOEXCEPT;
-};
-
-CONSTCD11
-bool
-operator==(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT;
-
-CONSTCD11
-bool
-operator!=(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT;
-
-CONSTCD14
-year_month_weekday_last
-operator+(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT;
-
-CONSTCD14
-year_month_weekday_last
-operator+(const months& dm, const year_month_weekday_last& ymwdl) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator+(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator+(const years& dy, const year_month_weekday_last& ymwdl) NOEXCEPT;
-
-CONSTCD14
-year_month_weekday_last
-operator-(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator-(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_weekday_last& ymwdl);
-
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
-inline namespace literals
-{
-
-CONSTCD11 islamic::day  operator "" _d(unsigned long long d) NOEXCEPT;
-CONSTCD11 islamic::year operator "" _y(unsigned long long y) NOEXCEPT;
-
-}  // inline namespace literals
-#endif // !defined(_MSC_VER) || (_MSC_VER >= 1900)
-
-//----------------+
-// Implementation |
-//----------------+
-
-// day
-
-CONSTCD11 inline day::day(unsigned d) NOEXCEPT : d_(static_cast<unsigned char>(d)) {}
-CONSTCD14 inline day& day::operator++() NOEXCEPT {++d_; return *this;}
-CONSTCD14 inline day day::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;}
-CONSTCD14 inline day& day::operator--() NOEXCEPT {--d_; return *this;}
-CONSTCD14 inline day day::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;}
-CONSTCD14 inline day& day::operator+=(const days& d) NOEXCEPT {*this = *this + d; return *this;}
-CONSTCD14 inline day& day::operator-=(const days& d) NOEXCEPT {*this = *this - d; return *this;}
-CONSTCD11 inline day::operator unsigned() const NOEXCEPT {return d_;}
-CONSTCD11 inline bool day::ok() const NOEXCEPT {return 1 <= d_ && d_ <= 30;}
-
-CONSTCD11
-inline
-bool
-operator==(const day& x, const day& y) NOEXCEPT
-{
-    return static_cast<unsigned>(x) == static_cast<unsigned>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const day& x, const day& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const day& x, const day& y) NOEXCEPT
-{
-    return static_cast<unsigned>(x) < static_cast<unsigned>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator>(const day& x, const day& y) NOEXCEPT
-{
-    return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const day& x, const day& y) NOEXCEPT
-{
-    return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const day& x, const day& y) NOEXCEPT
-{
-    return !(x < y);
-}
-
-CONSTCD11
-inline
-days
-operator-(const day& x, const day& y) NOEXCEPT
-{
-    return days{static_cast<days::rep>(static_cast<unsigned>(x)
-                                     - static_cast<unsigned>(y))};
-}
-
-CONSTCD11
-inline
-day
-operator+(const day& x, const days& y) NOEXCEPT
-{
-    return day{static_cast<unsigned>(x) + static_cast<unsigned>(y.count())};
-}
-
-CONSTCD11
-inline
-day
-operator+(const days& x, const day& y) NOEXCEPT
-{
-    return y + x;
-}
-
-CONSTCD11
-inline
-day
-operator-(const day& x, const days& y) NOEXCEPT
-{
-    return x + -y;
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const day& d)
-{
-    date::detail::save_ostream<CharT, Traits> _(os);
-    os.fill('0');
-    os.flags(std::ios::dec | std::ios::right);
-    os.width(2);
-    os << static_cast<unsigned>(d);
-    return os;
-}
-
-// month
-
-CONSTCD11 inline month::month(unsigned m) NOEXCEPT : m_(static_cast<decltype(m_)>(m)) {}
-CONSTCD14 inline month& month::operator++() NOEXCEPT {if (++m_ == 13) m_ = 1; return *this;}
-CONSTCD14 inline month month::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;}
-CONSTCD14 inline month& month::operator--() NOEXCEPT {if (--m_ == 0) m_ = 12; return *this;}
-CONSTCD14 inline month month::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;}
-
-CONSTCD14
-inline
-month&
-month::operator+=(const months& m) NOEXCEPT
-{
-    *this = *this + m;
-    return *this;
-}
-
-CONSTCD14
-inline
-month&
-month::operator-=(const months& m) NOEXCEPT
-{
-    *this = *this - m;
-    return *this;
-}
-
-CONSTCD11 inline month::operator unsigned() const NOEXCEPT {return m_;}
-CONSTCD11 inline bool month::ok() const NOEXCEPT {return 1 <= m_ && m_ <= 12;}
-
-CONSTCD11
-inline
-bool
-operator==(const month& x, const month& y) NOEXCEPT
-{
-    return static_cast<unsigned>(x) == static_cast<unsigned>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const month& x, const month& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const month& x, const month& y) NOEXCEPT
-{
-    return static_cast<unsigned>(x) < static_cast<unsigned>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator>(const month& x, const month& y) NOEXCEPT
-{
-    return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const month& x, const month& y) NOEXCEPT
-{
-    return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const month& x, const month& y) NOEXCEPT
-{
-    return !(x < y);
-}
-
-CONSTCD14
-inline
-months
-operator-(const month& x, const month& y) NOEXCEPT
-{
-    auto const d = static_cast<unsigned>(x) - static_cast<unsigned>(y);
-    return months(d <= 11 ? d : d + 12);
-}
-
-CONSTCD14
-inline
-month
-operator+(const month& x, const months& y) NOEXCEPT
-{
-    auto const mu = static_cast<long long>(static_cast<unsigned>(x)) - 1 + y.count();
-    auto const yr = (mu >= 0 ? mu : mu-11) / 12;
-    return month{static_cast<unsigned>(mu - yr * 12 + 1)};
-}
-
-CONSTCD14
-inline
-month
-operator+(const months& x, const month& y) NOEXCEPT
-{
-    return y + x;
-}
-
-CONSTCD14
-inline
-month
-operator-(const month& x, const months& y) NOEXCEPT
-{
-    return x + -y;
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month& m)
-{
-    switch (static_cast<unsigned>(m))
-    {
-    case 1:
-        os << "Muharram";
-        break;
-    case 2:
-        os << "Safar";
-        break;
-    case 3:
-        os << "Rabi' al-awwal";
-        break;
-    case 4:
-        os << "Rabi' al-thani";
-        break;
-    case 5:
-        os << "Jumada al-awwal";
-        break;
-    case 6:
-        os << "Jumada al-Thani";
-        break;
-    case 7:
-        os << "Rajab";
-        break;
-    case 8:
-        os << "Sha'ban";
-        break;
-    case 9:
-        os << "Ramadan";
-        break;
-    case 10:
-        os << "Shawwal";
-        break;
-    case 11:
-        os << "Dhu al-Qi'dah";
-        break;
-    case 12:
-        os << "Dhu al-Hijjah";
-        break;
-    default:
-        os << static_cast<unsigned>(m) << " is not a valid month";
-        break;
-    }
-    return os;
-}
-
-// year
-
-CONSTCD11 inline year::year(int y) NOEXCEPT : y_(static_cast<decltype(y_)>(y)) {}
-CONSTCD14 inline year& year::operator++() NOEXCEPT {++y_; return *this;}
-CONSTCD14 inline year year::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;}
-CONSTCD14 inline year& year::operator--() NOEXCEPT {--y_; return *this;}
-CONSTCD14 inline year year::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;}
-CONSTCD14 inline year& year::operator+=(const years& y) NOEXCEPT {*this = *this + y; return *this;}
-CONSTCD14 inline year& year::operator-=(const years& y) NOEXCEPT {*this = *this - y; return *this;}
-
-CONSTCD14
-inline
-bool
-year::is_leap() const NOEXCEPT
-{
-    int y = y_ - 1;
-    const int era = (y >= 0 ? y : y-29) / 30;
-    const unsigned yoe = static_cast<unsigned>(y - era * 30);
-    switch (yoe)
-    {
-    case 1:
-    case 4:
-    case 6:
-    case 9:
-    case 12:
-    case 15:
-    case 17:
-    case 20:
-    case 23:
-    case 25:
-    case 28:
-        return true;
-    default:
-        return false;
-    }
-}
-
-CONSTCD11 inline year::operator int() const NOEXCEPT {return y_;}
-CONSTCD11 inline bool year::ok() const NOEXCEPT {return true;}
-
-CONSTCD11
-inline
-year
-year::min() NOEXCEPT
-{
-    return year{std::numeric_limits<short>::min()};
-}
-
-CONSTCD11
-inline
-year
-year::max() NOEXCEPT
-{
-    return year{std::numeric_limits<short>::max()};
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year& x, const year& y) NOEXCEPT
-{
-    return static_cast<int>(x) == static_cast<int>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year& x, const year& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const year& x, const year& y) NOEXCEPT
-{
-    return static_cast<int>(x) < static_cast<int>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator>(const year& x, const year& y) NOEXCEPT
-{
-    return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const year& x, const year& y) NOEXCEPT
-{
-    return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const year& x, const year& y) NOEXCEPT
-{
-    return !(x < y);
-}
-
-CONSTCD11
-inline
-years
-operator-(const year& x, const year& y) NOEXCEPT
-{
-    return years{static_cast<int>(x) - static_cast<int>(y)};
-}
-
-CONSTCD11
-inline
-year
-operator+(const year& x, const years& y) NOEXCEPT
-{
-    return year{static_cast<int>(x) + y.count()};
-}
-
-CONSTCD11
-inline
-year
-operator+(const years& x, const year& y) NOEXCEPT
-{
-    return y + x;
-}
-
-CONSTCD11
-inline
-year
-operator-(const year& x, const years& y) NOEXCEPT
-{
-    return year{static_cast<int>(x) - y.count()};
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year& y)
-{
-    date::detail::save_ostream<CharT, Traits> _(os);
-    os.fill('0');
-    os.flags(std::ios::dec | std::ios::internal);
-    os.width(4 + (y < year{0}));
-    os << static_cast<int>(y);
-    return os;
-}
-
-// weekday
-
-CONSTCD11
-inline
-unsigned char
-weekday::weekday_from_days(int z) NOEXCEPT
-{
-    return static_cast<unsigned char>(static_cast<unsigned>(
-        z >= -4 ? (z+4) % 7 : (z+5) % 7 + 6));
-}
-
-CONSTCD11
-inline
-weekday::weekday(unsigned wd) NOEXCEPT
-    : wd_(static_cast<decltype(wd_)>(wd))
-    {}
-
-CONSTCD11
-inline
-weekday::weekday(const sys_days& dp) NOEXCEPT
-    : wd_(weekday_from_days(dp.time_since_epoch().count()))
-    {}
-
-CONSTCD11
-inline
-weekday::weekday(const local_days& dp) NOEXCEPT
-    : wd_(weekday_from_days(dp.time_since_epoch().count()))
-    {}
-
-CONSTCD14 inline weekday& weekday::operator++() NOEXCEPT {if (++wd_ == 7) wd_ = 0; return *this;}
-CONSTCD14 inline weekday weekday::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;}
-CONSTCD14 inline weekday& weekday::operator--() NOEXCEPT {if (wd_-- == 0) wd_ = 6; return *this;}
-CONSTCD14 inline weekday weekday::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;}
-
-CONSTCD14
-inline
-weekday&
-weekday::operator+=(const days& d) NOEXCEPT
-{
-    *this = *this + d;
-    return *this;
-}
-
-CONSTCD14
-inline
-weekday&
-weekday::operator-=(const days& d) NOEXCEPT
-{
-    *this = *this - d;
-    return *this;
-}
-
-CONSTCD11
-inline
-weekday::operator unsigned() const NOEXCEPT
-{
-    return static_cast<unsigned>(wd_);
-}
-
-CONSTCD11 inline bool weekday::ok() const NOEXCEPT {return wd_ <= 6;}
-
-CONSTCD11
-inline
-bool
-operator==(const weekday& x, const weekday& y) NOEXCEPT
-{
-    return static_cast<unsigned>(x) == static_cast<unsigned>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const weekday& x, const weekday& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-CONSTCD14
-inline
-days
-operator-(const weekday& x, const weekday& y) NOEXCEPT
-{
-    auto const diff = static_cast<unsigned>(x) - static_cast<unsigned>(y);
-    return days{diff <= 6 ? diff : diff + 7};
-}
-
-CONSTCD14
-inline
-weekday
-operator+(const weekday& x, const days& y) NOEXCEPT
-{
-    auto const wdu = static_cast<long long>(static_cast<unsigned>(x)) + y.count();
-    auto const wk = (wdu >= 0 ? wdu : wdu-6) / 7;
-    return weekday{static_cast<unsigned>(wdu - wk * 7)};
-}
-
-CONSTCD14
-inline
-weekday
-operator+(const days& x, const weekday& y) NOEXCEPT
-{
-    return y + x;
-}
-
-CONSTCD14
-inline
-weekday
-operator-(const weekday& x, const days& y) NOEXCEPT
-{
-    return x + -y;
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday& wd)
-{
-    switch (static_cast<unsigned>(wd))
-    {
-    case 0:
-        os << "al-Aáž„ad";
-        break;
-    case 1:
-        os << "al-Ithnayn";
-        break;
-    case 2:
-        os << "ath-Thulāthā’";
-        break;
-    case 3:
-        os << "al-Arba‘ā’";
-        break;
-    case 4:
-        os << "al-Khamīs";
-        break;
-    case 5:
-        os << "al-Jum‘ah";
-        break;
-    case 6:
-        os << "as-Sabt";
-        break;
-    default:
-        os << static_cast<unsigned>(wd) << " is not a valid weekday";
-        break;
-    }
-    return os;
-}
-
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
-inline namespace literals
-{
-
-CONSTCD11
-inline
-islamic::day
-operator "" _d(unsigned long long d) NOEXCEPT
-{
-    return islamic::day{static_cast<unsigned>(d)};
-}
-
-CONSTCD11
-inline
-islamic::year
-operator "" _y(unsigned long long y) NOEXCEPT
-{
-    return islamic::year(static_cast<int>(y));
-}
-#endif  // !defined(_MSC_VER) || (_MSC_VER >= 1900)
-
-CONSTDATA islamic::last_spec last{};
-
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
-}  // inline namespace literals
-#endif
-
-// weekday_indexed
-
-CONSTCD11
-inline
-weekday
-weekday_indexed::weekday() const NOEXCEPT
-{
-    return islamic::weekday{static_cast<unsigned>(wd_)};
-}
-
-CONSTCD11 inline unsigned weekday_indexed::index() const NOEXCEPT {return index_;}
-
-CONSTCD11
-inline
-bool
-weekday_indexed::ok() const NOEXCEPT
-{
-    return weekday().ok() && 1 <= index_ && index_ <= 5;
-}
-
-CONSTCD11
-inline
-weekday_indexed::weekday_indexed(const islamic::weekday& wd, unsigned index) NOEXCEPT
-    : wd_(static_cast<decltype(wd_)>(static_cast<unsigned>(wd)))
-    , index_(static_cast<decltype(index_)>(index))
-    {}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday_indexed& wdi)
-{
-    return os << wdi.weekday() << '[' << wdi.index() << ']';
-}
-
-CONSTCD11
-inline
-weekday_indexed
-weekday::operator[](unsigned index) const NOEXCEPT
-{
-    return {*this, index};
-}
-
-CONSTCD11
-inline
-bool
-operator==(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT
-{
-    return x.weekday() == y.weekday() && x.index() == y.index();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-// weekday_last
-
-CONSTCD11 inline islamic::weekday weekday_last::weekday() const NOEXCEPT {return wd_;}
-CONSTCD11 inline bool weekday_last::ok() const NOEXCEPT {return wd_.ok();}
-CONSTCD11 inline weekday_last::weekday_last(const islamic::weekday& wd) NOEXCEPT : wd_(wd) {}
-
-CONSTCD11
-inline
-bool
-operator==(const weekday_last& x, const weekday_last& y) NOEXCEPT
-{
-    return x.weekday() == y.weekday();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const weekday_last& x, const weekday_last& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday_last& wdl)
-{
-    return os << wdl.weekday() << "[last]";
-}
-
-CONSTCD11
-inline
-weekday_last
-weekday::operator[](last_spec) const NOEXCEPT
-{
-    return weekday_last{*this};
-}
-
-// year_month
-
-CONSTCD11
-inline
-year_month::year_month(const islamic::year& y, const islamic::month& m) NOEXCEPT
-    : y_(y)
-    , m_(m)
-    {}
-
-CONSTCD11 inline year year_month::year() const NOEXCEPT {return y_;}
-CONSTCD11 inline month year_month::month() const NOEXCEPT {return m_;}
-CONSTCD11 inline bool year_month::ok() const NOEXCEPT {return y_.ok() && m_.ok();}
-
-CONSTCD14
-inline
-year_month&
-year_month::operator+=(const months& dm) NOEXCEPT
-{
-    *this = *this + dm;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month&
-year_month::operator-=(const months& dm) NOEXCEPT
-{
-    *this = *this - dm;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month&
-year_month::operator+=(const years& dy) NOEXCEPT
-{
-    *this = *this + dy;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month&
-year_month::operator-=(const years& dy) NOEXCEPT
-{
-    *this = *this - dy;
-    return *this;
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year_month& x, const year_month& y) NOEXCEPT
-{
-    return x.year() == y.year() && x.month() == y.month();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year_month& x, const year_month& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const year_month& x, const year_month& y) NOEXCEPT
-{
-    return x.year() < y.year() ? true
-        : (x.year() > y.year() ? false
-        : (x.month() < y.month()));
-}
-
-CONSTCD11
-inline
-bool
-operator>(const year_month& x, const year_month& y) NOEXCEPT
-{
-    return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const year_month& x, const year_month& y) NOEXCEPT
-{
-    return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const year_month& x, const year_month& y) NOEXCEPT
-{
-    return !(x < y);
-}
-
-CONSTCD14
-inline
-year_month
-operator+(const year_month& ym, const months& dm) NOEXCEPT
-{
-    auto dmi = static_cast<int>(static_cast<unsigned>(ym.month())) - 1 + dm.count();
-    auto dy = (dmi >= 0 ? dmi : dmi-11) / 12;
-    dmi = dmi - dy * 12 + 1;
-    return (ym.year() + years(dy)) / month(static_cast<unsigned>(dmi));
-}
-
-CONSTCD14
-inline
-year_month
-operator+(const months& dm, const year_month& ym) NOEXCEPT
-{
-    return ym + dm;
-}
-
-CONSTCD14
-inline
-year_month
-operator-(const year_month& ym, const months& dm) NOEXCEPT
-{
-    return ym + -dm;
-}
-
-CONSTCD11
-inline
-months
-operator-(const year_month& x, const year_month& y) NOEXCEPT
-{
-    return (x.year() - y.year()) +
-            months(static_cast<unsigned>(x.month()) - static_cast<unsigned>(y.month()));
-}
-
-CONSTCD11
-inline
-year_month
-operator+(const year_month& ym, const years& dy) NOEXCEPT
-{
-    return (ym.year() + dy) / ym.month();
-}
-
-CONSTCD11
-inline
-year_month
-operator+(const years& dy, const year_month& ym) NOEXCEPT
-{
-    return ym + dy;
-}
-
-CONSTCD11
-inline
-year_month
-operator-(const year_month& ym, const years& dy) NOEXCEPT
-{
-    return ym + -dy;
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month& ym)
-{
-    return os << ym.year() << '/' << ym.month();
-}
-
-// month_day
-
-CONSTCD11
-inline
-month_day::month_day(const islamic::month& m, const islamic::day& d) NOEXCEPT
-    : m_(m)
-    , d_(d)
-    {}
-
-CONSTCD11 inline islamic::month month_day::month() const NOEXCEPT {return m_;}
-CONSTCD11 inline islamic::day month_day::day() const NOEXCEPT {return d_;}
-
-CONSTCD14
-inline
-bool
-month_day::ok() const NOEXCEPT
-{
-    CONSTDATA islamic::day d[] =
-        {30_d, 29_d, 30_d, 29_d, 30_d, 29_d, 30_d, 29_d, 30_d, 29_d, 30_d, 30_d};
-    return m_.ok() && 1_d <= d_ && d_ <= d[static_cast<unsigned>(m_)-1];
-}
-
-CONSTCD11
-inline
-bool
-operator==(const month_day& x, const month_day& y) NOEXCEPT
-{
-    return x.month() == y.month() && x.day() == y.day();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const month_day& x, const month_day& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const month_day& x, const month_day& y) NOEXCEPT
-{
-    return x.month() < y.month() ? true
-        : (x.month() > y.month() ? false
-        : (x.day() < y.day()));
-}
-
-CONSTCD11
-inline
-bool
-operator>(const month_day& x, const month_day& y) NOEXCEPT
-{
-    return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const month_day& x, const month_day& y) NOEXCEPT
-{
-    return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const month_day& x, const month_day& y) NOEXCEPT
-{
-    return !(x < y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_day& md)
-{
-    return os << md.month() << '/' << md.day();
-}
-
-// month_day_last
-
-CONSTCD11 inline month month_day_last::month() const NOEXCEPT {return m_;}
-CONSTCD11 inline bool month_day_last::ok() const NOEXCEPT {return m_.ok();}
-CONSTCD11 inline month_day_last::month_day_last(const islamic::month& m) NOEXCEPT : m_(m) {}
-
-CONSTCD11
-inline
-bool
-operator==(const month_day_last& x, const month_day_last& y) NOEXCEPT
-{
-    return x.month() == y.month();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const month_day_last& x, const month_day_last& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const month_day_last& x, const month_day_last& y) NOEXCEPT
-{
-    return x.month() < y.month();
-}
-
-CONSTCD11
-inline
-bool
-operator>(const month_day_last& x, const month_day_last& y) NOEXCEPT
-{
-    return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const month_day_last& x, const month_day_last& y) NOEXCEPT
-{
-    return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const month_day_last& x, const month_day_last& y) NOEXCEPT
-{
-    return !(x < y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_day_last& mdl)
-{
-    return os << mdl.month() << "/last";
-}
-
-// month_weekday
-
-CONSTCD11
-inline
-month_weekday::month_weekday(const islamic::month& m,
-                             const islamic::weekday_indexed& wdi) NOEXCEPT
-    : m_(m)
-    , wdi_(wdi)
-    {}
-
-CONSTCD11 inline month month_weekday::month() const NOEXCEPT {return m_;}
-
-CONSTCD11
-inline
-weekday_indexed
-month_weekday::weekday_indexed() const NOEXCEPT
-{
-    return wdi_;
-}
-
-CONSTCD11
-inline
-bool
-month_weekday::ok() const NOEXCEPT
-{
-    return m_.ok() && wdi_.ok();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const month_weekday& x, const month_weekday& y) NOEXCEPT
-{
-    return x.month() == y.month() && x.weekday_indexed() == y.weekday_indexed();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const month_weekday& x, const month_weekday& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_weekday& mwd)
-{
-    return os << mwd.month() << '/' << mwd.weekday_indexed();
-}
-
-// month_weekday_last
-
-CONSTCD11
-inline
-month_weekday_last::month_weekday_last(const islamic::month& m,
-                                       const islamic::weekday_last& wdl) NOEXCEPT
-    : m_(m)
-    , wdl_(wdl)
-    {}
-
-CONSTCD11 inline month month_weekday_last::month() const NOEXCEPT {return m_;}
-
-CONSTCD11
-inline
-weekday_last
-month_weekday_last::weekday_last() const NOEXCEPT
-{
-    return wdl_;
-}
-
-CONSTCD11
-inline
-bool
-month_weekday_last::ok() const NOEXCEPT
-{
-    return m_.ok() && wdl_.ok();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT
-{
-    return x.month() == y.month() && x.weekday_last() == y.weekday_last();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_weekday_last& mwdl)
-{
-    return os << mwdl.month() << '/' << mwdl.weekday_last();
-}
-
-// year_month_day_last
-
-CONSTCD11
-inline
-year_month_day_last::year_month_day_last(const islamic::year& y,
-                                         const islamic::month_day_last& mdl) NOEXCEPT
-    : y_(y)
-    , mdl_(mdl)
-    {}
-
-CONSTCD14
-inline
-year_month_day_last&
-year_month_day_last::operator+=(const months& m) NOEXCEPT
-{
-    *this = *this + m;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month_day_last&
-year_month_day_last::operator-=(const months& m) NOEXCEPT
-{
-    *this = *this - m;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month_day_last&
-year_month_day_last::operator+=(const years& y) NOEXCEPT
-{
-    *this = *this + y;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month_day_last&
-year_month_day_last::operator-=(const years& y) NOEXCEPT
-{
-    *this = *this - y;
-    return *this;
-}
-
-CONSTCD11 inline year year_month_day_last::year() const NOEXCEPT {return y_;}
-CONSTCD11 inline month year_month_day_last::month() const NOEXCEPT {return mdl_.month();}
-
-CONSTCD11
-inline
-month_day_last
-year_month_day_last::month_day_last() const NOEXCEPT
-{
-    return mdl_;
-}
-
-CONSTCD14
-inline
-day
-year_month_day_last::day() const NOEXCEPT
-{
-    CONSTDATA islamic::day d[] =
-        {30_d, 29_d, 30_d, 29_d, 30_d, 29_d, 30_d, 29_d, 30_d, 29_d, 30_d, 29_d};
-    return month() != islamic::month(12) || !y_.is_leap() ?
-               d[static_cast<unsigned>(month())-1] : 30_d;
-}
-
-CONSTCD14
-inline
-year_month_day_last::operator sys_days() const NOEXCEPT
-{
-    return sys_days(year()/month()/day());
-}
-
-CONSTCD14
-inline
-year_month_day_last::operator local_days() const NOEXCEPT
-{
-    return local_days(year()/month()/day());
-}
-
-CONSTCD11
-inline
-bool
-year_month_day_last::ok() const NOEXCEPT
-{
-    return y_.ok() && mdl_.ok();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT
-{
-    return x.year() == y.year() && x.month_day_last() == y.month_day_last();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT
-{
-    return x.year() < y.year() ? true
-        : (x.year() > y.year() ? false
-        : (x.month_day_last() < y.month_day_last()));
-}
-
-CONSTCD11
-inline
-bool
-operator>(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT
-{
-    return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT
-{
-    return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT
-{
-    return !(x < y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_day_last& ymdl)
-{
-    return os << ymdl.year() << '/' << ymdl.month_day_last();
-}
-
-CONSTCD14
-inline
-year_month_day_last
-operator+(const year_month_day_last& ymdl, const months& dm) NOEXCEPT
-{
-    return (ymdl.year() / ymdl.month() + dm) / last;
-}
-
-CONSTCD14
-inline
-year_month_day_last
-operator+(const months& dm, const year_month_day_last& ymdl) NOEXCEPT
-{
-    return ymdl + dm;
-}
-
-CONSTCD14
-inline
-year_month_day_last
-operator-(const year_month_day_last& ymdl, const months& dm) NOEXCEPT
-{
-    return ymdl + (-dm);
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator+(const year_month_day_last& ymdl, const years& dy) NOEXCEPT
-{
-    return {ymdl.year()+dy, ymdl.month_day_last()};
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator+(const years& dy, const year_month_day_last& ymdl) NOEXCEPT
-{
-    return ymdl + dy;
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator-(const year_month_day_last& ymdl, const years& dy) NOEXCEPT
-{
-    return ymdl + (-dy);
-}
-
-// year_month_day
-
-CONSTCD11
-inline
-year_month_day::year_month_day(const islamic::year& y, const islamic::month& m,
-                               const islamic::day& d) NOEXCEPT
-    : y_(y)
-    , m_(m)
-    , d_(d)
-    {}
-
-CONSTCD14
-inline
-year_month_day::year_month_day(const year_month_day_last& ymdl) NOEXCEPT
-    : y_(ymdl.year())
-    , m_(ymdl.month())
-    , d_(ymdl.day())
-    {}
-
-CONSTCD14
-inline
-year_month_day::year_month_day(sys_days dp) NOEXCEPT
-    : year_month_day(from_days(dp.time_since_epoch()))
-    {}
-
-CONSTCD14
-inline
-year_month_day::year_month_day(local_days dp) NOEXCEPT
-    : year_month_day(from_days(dp.time_since_epoch()))
-    {}
-
-CONSTCD11 inline year year_month_day::year() const NOEXCEPT {return y_;}
-CONSTCD11 inline month year_month_day::month() const NOEXCEPT {return m_;}
-CONSTCD11 inline day year_month_day::day() const NOEXCEPT {return d_;}
-
-CONSTCD14
-inline
-year_month_day&
-year_month_day::operator+=(const months& m) NOEXCEPT
-{
-    *this = *this + m;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month_day&
-year_month_day::operator-=(const months& m) NOEXCEPT
-{
-    *this = *this - m;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month_day&
-year_month_day::operator+=(const years& y) NOEXCEPT
-{
-    *this = *this + y;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month_day&
-year_month_day::operator-=(const years& y) NOEXCEPT
-{
-    *this = *this - y;
-    return *this;
-}
-
-CONSTCD14
-inline
-days
-year_month_day::to_days() const NOEXCEPT
-{
-    static_assert(std::numeric_limits<unsigned>::digits >= 18,
-             "This algorithm has not been ported to a 16 bit unsigned integer");
-    static_assert(std::numeric_limits<int>::digits >= 20,
-             "This algorithm has not been ported to a 16 bit signed integer");
-    auto const y = static_cast<int>(y_) - 1;
-    auto const m = static_cast<unsigned>(m_);
-    auto const d = static_cast<unsigned>(d_);
-    auto const era = (y >= 0 ? y : y-29) / 30;
-    auto const yoe = static_cast<unsigned>(y - era * 30);      // [0, 29]
-    auto const doy = 29*(m-1) + m/2 + d-1;                     // [0, 354]
-    auto const doe = yoe * 354 + (11*(yoe+1)+3)/30 + doy;      // [0, 10630]
-    return days{era * 10631 + static_cast<int>(doe) - 492148};
-}
-
-CONSTCD14
-inline
-year_month_day::operator sys_days() const NOEXCEPT
-{
-    return sys_days{to_days()};
-}
-
-CONSTCD14
-inline
-year_month_day::operator local_days() const NOEXCEPT
-{
-    return local_days{to_days()};
-}
-
-CONSTCD14
-inline
-bool
-year_month_day::ok() const NOEXCEPT
-{
-    if (!(y_.ok() && m_.ok()))
-        return false;
-    return 1_d <= d_ && d_ <= (y_/m_/last).day();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year_month_day& x, const year_month_day& y) NOEXCEPT
-{
-    return x.year() == y.year() && x.month() == y.month() && x.day() == y.day();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year_month_day& x, const year_month_day& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const year_month_day& x, const year_month_day& y) NOEXCEPT
-{
-    return x.year() < y.year() ? true
-        : (x.year() > y.year() ? false
-        : (x.month() < y.month() ? true
-        : (x.month() > y.month() ? false
-        : (x.day() < y.day()))));
-}
-
-CONSTCD11
-inline
-bool
-operator>(const year_month_day& x, const year_month_day& y) NOEXCEPT
-{
-    return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const year_month_day& x, const year_month_day& y) NOEXCEPT
-{
-    return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const year_month_day& x, const year_month_day& y) NOEXCEPT
-{
-    return !(x < y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_day& ymd)
-{
-    date::detail::save_ostream<CharT, Traits> _(os);
-    os.fill('0');
-    os.flags(std::ios::dec | std::ios::right);
-    os << ymd.year() << '-';
-    os.width(2);
-    os << static_cast<unsigned>(ymd.month()) << '-';
-    os << ymd.day();
-    return os;
-}
-
-CONSTCD14
-inline
-year_month_day
-year_month_day::from_days(days dp) NOEXCEPT
-{
-    static_assert(std::numeric_limits<unsigned>::digits >= 18,
-             "This algorithm has not been ported to a 16 bit unsigned integer");
-    static_assert(std::numeric_limits<int>::digits >= 20,
-             "This algorithm has not been ported to a 16 bit signed integer");
-    auto const z = dp.count() + 492148;
-    auto const era = (z >= 0 ? z : z - 10630) / 10631;
-    auto const doe = static_cast<unsigned>(z - era * 10631);         // [0, 10630]
-    auto const yoe = (30*doe + 10646)/10631 - 1;                     // [0, 29]
-    auto const y = static_cast<sys_days::rep>(yoe) + era * 30 + 1;
-    auto const doy = doe - (yoe * 354 + (11*(yoe+1)+3)/30);          // [0, 354]
-    auto const m = (11*doy + 330) / 325;                             // [1, 12]
-    auto const d = doy - (29*(m-1) + m/2) + 1;                       // [1, 30]
-    return year_month_day{islamic::year{y}, islamic::month(m), islamic::day(d)};
-}
-
-CONSTCD14
-inline
-year_month_day
-operator+(const year_month_day& ymd, const months& dm) NOEXCEPT
-{
-    return (ymd.year() / ymd.month() + dm) / ymd.day();
-}
-
-CONSTCD14
-inline
-year_month_day
-operator+(const months& dm, const year_month_day& ymd) NOEXCEPT
-{
-    return ymd + dm;
-}
-
-CONSTCD14
-inline
-year_month_day
-operator-(const year_month_day& ymd, const months& dm) NOEXCEPT
-{
-    return ymd + (-dm);
-}
-
-CONSTCD11
-inline
-year_month_day
-operator+(const year_month_day& ymd, const years& dy) NOEXCEPT
-{
-    return (ymd.year() + dy) / ymd.month() / ymd.day();
-}
-
-CONSTCD11
-inline
-year_month_day
-operator+(const years& dy, const year_month_day& ymd) NOEXCEPT
-{
-    return ymd + dy;
-}
-
-CONSTCD11
-inline
-year_month_day
-operator-(const year_month_day& ymd, const years& dy) NOEXCEPT
-{
-    return ymd + (-dy);
-}
-
-// year_month_weekday
-
-CONSTCD11
-inline
-year_month_weekday::year_month_weekday(const islamic::year& y, const islamic::month& m,
-                                       const islamic::weekday_indexed& wdi)
-        NOEXCEPT
-    : y_(y)
-    , m_(m)
-    , wdi_(wdi)
-    {}
-
-CONSTCD14
-inline
-year_month_weekday::year_month_weekday(const sys_days& dp) NOEXCEPT
-    : year_month_weekday(from_days(dp.time_since_epoch()))
-    {}
-
-CONSTCD14
-inline
-year_month_weekday::year_month_weekday(const local_days& dp) NOEXCEPT
-    : year_month_weekday(from_days(dp.time_since_epoch()))
-    {}
-
-CONSTCD14
-inline
-year_month_weekday&
-year_month_weekday::operator+=(const months& m) NOEXCEPT
-{
-    *this = *this + m;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month_weekday&
-year_month_weekday::operator-=(const months& m) NOEXCEPT
-{
-    *this = *this - m;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month_weekday&
-year_month_weekday::operator+=(const years& y) NOEXCEPT
-{
-    *this = *this + y;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month_weekday&
-year_month_weekday::operator-=(const years& y) NOEXCEPT
-{
-    *this = *this - y;
-    return *this;
-}
-
-CONSTCD11 inline year year_month_weekday::year() const NOEXCEPT {return y_;}
-CONSTCD11 inline month year_month_weekday::month() const NOEXCEPT {return m_;}
-
-CONSTCD11
-inline
-weekday
-year_month_weekday::weekday() const NOEXCEPT
-{
-    return wdi_.weekday();
-}
-
-CONSTCD11
-inline
-unsigned
-year_month_weekday::index() const NOEXCEPT
-{
-    return wdi_.index();
-}
-
-CONSTCD11
-inline
-weekday_indexed
-year_month_weekday::weekday_indexed() const NOEXCEPT
-{
-    return wdi_;
-}
-
-CONSTCD14
-inline
-year_month_weekday::operator sys_days() const NOEXCEPT
-{
-    return sys_days{to_days()};
-}
-
-CONSTCD14
-inline
-year_month_weekday::operator local_days() const NOEXCEPT
-{
-    return local_days{to_days()};
-}
-
-CONSTCD14
-inline
-bool
-year_month_weekday::ok() const NOEXCEPT
-{
-    if (!y_.ok() || !m_.ok() || !wdi_.weekday().ok() || wdi_.index() < 1)
-        return false;
-    if (wdi_.index() <= 4)
-        return true;
-    auto d2 = wdi_.weekday() - islamic::weekday(y_/m_/1) + days((wdi_.index()-1)*7 + 1);
-    return static_cast<unsigned>(d2.count()) <= static_cast<unsigned>((y_/m_/last).day());
-}
-
-CONSTCD14
-inline
-year_month_weekday
-year_month_weekday::from_days(days d) NOEXCEPT
-{
-    sys_days dp{d};
-    auto const wd = islamic::weekday(dp);
-    auto const ymd = year_month_day(dp);
-    return {ymd.year(), ymd.month(), wd[(static_cast<unsigned>(ymd.day())-1)/7+1]};
-}
-
-CONSTCD14
-inline
-days
-year_month_weekday::to_days() const NOEXCEPT
-{
-    auto d = sys_days(y_/m_/1);
-    return (d + (wdi_.weekday() - islamic::weekday(d) + days{(wdi_.index()-1)*7})
-           ).time_since_epoch();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT
-{
-    return x.year() == y.year() && x.month() == y.month() &&
-           x.weekday_indexed() == y.weekday_indexed();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_weekday& ymwdi)
-{
-    return os << ymwdi.year() << '/' << ymwdi.month()
-              << '/' << ymwdi.weekday_indexed();
-}
-
-CONSTCD14
-inline
-year_month_weekday
-operator+(const year_month_weekday& ymwd, const months& dm) NOEXCEPT
-{
-    return (ymwd.year() / ymwd.month() + dm) / ymwd.weekday_indexed();
-}
-
-CONSTCD14
-inline
-year_month_weekday
-operator+(const months& dm, const year_month_weekday& ymwd) NOEXCEPT
-{
-    return ymwd + dm;
-}
-
-CONSTCD14
-inline
-year_month_weekday
-operator-(const year_month_weekday& ymwd, const months& dm) NOEXCEPT
-{
-    return ymwd + (-dm);
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator+(const year_month_weekday& ymwd, const years& dy) NOEXCEPT
-{
-    return {ymwd.year()+dy, ymwd.month(), ymwd.weekday_indexed()};
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator+(const years& dy, const year_month_weekday& ymwd) NOEXCEPT
-{
-    return ymwd + dy;
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator-(const year_month_weekday& ymwd, const years& dy) NOEXCEPT
-{
-    return ymwd + (-dy);
-}
-
-// year_month_weekday_last
-
-CONSTCD11
-inline
-year_month_weekday_last::year_month_weekday_last(const islamic::year& y,
-                                                 const islamic::month& m,
-                                                 const islamic::weekday_last& wdl) NOEXCEPT
-    : y_(y)
-    , m_(m)
-    , wdl_(wdl)
-    {}
-
-CONSTCD14
-inline
-year_month_weekday_last&
-year_month_weekday_last::operator+=(const months& m) NOEXCEPT
-{
-    *this = *this + m;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month_weekday_last&
-year_month_weekday_last::operator-=(const months& m) NOEXCEPT
-{
-    *this = *this - m;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month_weekday_last&
-year_month_weekday_last::operator+=(const years& y) NOEXCEPT
-{
-    *this = *this + y;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month_weekday_last&
-year_month_weekday_last::operator-=(const years& y) NOEXCEPT
-{
-    *this = *this - y;
-    return *this;
-}
-
-CONSTCD11 inline year year_month_weekday_last::year() const NOEXCEPT {return y_;}
-CONSTCD11 inline month year_month_weekday_last::month() const NOEXCEPT {return m_;}
-
-CONSTCD11
-inline
-weekday
-year_month_weekday_last::weekday() const NOEXCEPT
-{
-    return wdl_.weekday();
-}
-
-CONSTCD11
-inline
-weekday_last
-year_month_weekday_last::weekday_last() const NOEXCEPT
-{
-    return wdl_;
-}
-
-CONSTCD14
-inline
-year_month_weekday_last::operator sys_days() const NOEXCEPT
-{
-    return sys_days{to_days()};
-}
-
-CONSTCD14
-inline
-year_month_weekday_last::operator local_days() const NOEXCEPT
-{
-    return local_days{to_days()};
-}
-
-CONSTCD11
-inline
-bool
-year_month_weekday_last::ok() const NOEXCEPT
-{
-    return y_.ok() && m_.ok() && wdl_.ok();
-}
-
-CONSTCD14
-inline
-days
-year_month_weekday_last::to_days() const NOEXCEPT
-{
-    auto const d = sys_days(y_/m_/last);
-    return (d - (islamic::weekday{d} - wdl_.weekday())).time_since_epoch();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT
-{
-    return x.year() == y.year() && x.month() == y.month() &&
-           x.weekday_last() == y.weekday_last();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_weekday_last& ymwdl)
-{
-    return os << ymwdl.year() << '/' << ymwdl.month() << '/' << ymwdl.weekday_last();
-}
-
-CONSTCD14
-inline
-year_month_weekday_last
-operator+(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT
-{
-    return (ymwdl.year() / ymwdl.month() + dm) / ymwdl.weekday_last();
-}
-
-CONSTCD14
-inline
-year_month_weekday_last
-operator+(const months& dm, const year_month_weekday_last& ymwdl) NOEXCEPT
-{
-    return ymwdl + dm;
-}
-
-CONSTCD14
-inline
-year_month_weekday_last
-operator-(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT
-{
-    return ymwdl + (-dm);
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator+(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT
-{
-    return {ymwdl.year()+dy, ymwdl.month(), ymwdl.weekday_last()};
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator+(const years& dy, const year_month_weekday_last& ymwdl) NOEXCEPT
-{
-    return ymwdl + dy;
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator-(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT
-{
-    return ymwdl + (-dy);
-}
-
-// year_month from operator/()
-
-CONSTCD11
-inline
-year_month
-operator/(const year& y, const month& m) NOEXCEPT
-{
-    return {y, m};
-}
-
-CONSTCD11
-inline
-year_month
-operator/(const year& y, int   m) NOEXCEPT
-{
-    return y / month(static_cast<unsigned>(m));
-}
-
-// month_day from operator/()
-
-CONSTCD11
-inline
-month_day
-operator/(const month& m, const day& d) NOEXCEPT
-{
-    return {m, d};
-}
-
-CONSTCD11
-inline
-month_day
-operator/(const day& d, const month& m) NOEXCEPT
-{
-    return m / d;
-}
-
-CONSTCD11
-inline
-month_day
-operator/(const month& m, int d) NOEXCEPT
-{
-    return m / day(static_cast<unsigned>(d));
-}
-
-CONSTCD11
-inline
-month_day
-operator/(int m, const day& d) NOEXCEPT
-{
-    return month(static_cast<unsigned>(m)) / d;
-}
-
-CONSTCD11 inline month_day operator/(const day& d, int m) NOEXCEPT {return m / d;}
-
-// month_day_last from operator/()
-
-CONSTCD11
-inline
-month_day_last
-operator/(const month& m, last_spec) NOEXCEPT
-{
-    return month_day_last{m};
-}
-
-CONSTCD11
-inline
-month_day_last
-operator/(last_spec, const month& m) NOEXCEPT
-{
-    return m/last;
-}
-
-CONSTCD11
-inline
-month_day_last
-operator/(int m, last_spec) NOEXCEPT
-{
-    return month(static_cast<unsigned>(m))/last;
-}
-
-CONSTCD11
-inline
-month_day_last
-operator/(last_spec, int m) NOEXCEPT
-{
-    return m/last;
-}
-
-// month_weekday from operator/()
-
-CONSTCD11
-inline
-month_weekday
-operator/(const month& m, const weekday_indexed& wdi) NOEXCEPT
-{
-    return {m, wdi};
-}
-
-CONSTCD11
-inline
-month_weekday
-operator/(const weekday_indexed& wdi, const month& m) NOEXCEPT
-{
-    return m / wdi;
-}
-
-CONSTCD11
-inline
-month_weekday
-operator/(int m, const weekday_indexed& wdi) NOEXCEPT
-{
-    return month(static_cast<unsigned>(m)) / wdi;
-}
-
-CONSTCD11
-inline
-month_weekday
-operator/(const weekday_indexed& wdi, int m) NOEXCEPT
-{
-    return m / wdi;
-}
-
-// month_weekday_last from operator/()
-
-CONSTCD11
-inline
-month_weekday_last
-operator/(const month& m, const weekday_last& wdl) NOEXCEPT
-{
-    return {m, wdl};
-}
-
-CONSTCD11
-inline
-month_weekday_last
-operator/(const weekday_last& wdl, const month& m) NOEXCEPT
-{
-    return m / wdl;
-}
-
-CONSTCD11
-inline
-month_weekday_last
-operator/(int m, const weekday_last& wdl) NOEXCEPT
-{
-    return month(static_cast<unsigned>(m)) / wdl;
-}
-
-CONSTCD11
-inline
-month_weekday_last
-operator/(const weekday_last& wdl, int m) NOEXCEPT
-{
-    return m / wdl;
-}
-
-// year_month_day from operator/()
-
-CONSTCD11
-inline
-year_month_day
-operator/(const year_month& ym, const day& d) NOEXCEPT
-{
-    return {ym.year(), ym.month(), d};
-}
-
-CONSTCD11
-inline
-year_month_day
-operator/(const year_month& ym, int d)  NOEXCEPT
-{
-    return ym / day(static_cast<unsigned>(d));
-}
-
-CONSTCD11
-inline
-year_month_day
-operator/(const year& y, const month_day& md) NOEXCEPT
-{
-    return y / md.month() / md.day();
-}
-
-CONSTCD11
-inline
-year_month_day
-operator/(int y, const month_day& md) NOEXCEPT
-{
-    return year(y) / md;
-}
-
-CONSTCD11
-inline
-year_month_day
-operator/(const month_day& md, const year& y)  NOEXCEPT
-{
-    return y / md;
-}
-
-CONSTCD11
-inline
-year_month_day
-operator/(const month_day& md, int y) NOEXCEPT
-{
-    return year(y) / md;
-}
-
-// year_month_day_last from operator/()
-
-CONSTCD11
-inline
-year_month_day_last
-operator/(const year_month& ym, last_spec) NOEXCEPT
-{
-    return {ym.year(), month_day_last{ym.month()}};
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator/(const year& y, const month_day_last& mdl) NOEXCEPT
-{
-    return {y, mdl};
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator/(int y, const month_day_last& mdl) NOEXCEPT
-{
-    return year(y) / mdl;
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator/(const month_day_last& mdl, const year& y) NOEXCEPT
-{
-    return y / mdl;
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator/(const month_day_last& mdl, int y) NOEXCEPT
-{
-    return year(y) / mdl;
-}
-
-// year_month_weekday from operator/()
-
-CONSTCD11
-inline
-year_month_weekday
-operator/(const year_month& ym, const weekday_indexed& wdi) NOEXCEPT
-{
-    return {ym.year(), ym.month(), wdi};
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator/(const year& y, const month_weekday& mwd) NOEXCEPT
-{
-    return {y, mwd.month(), mwd.weekday_indexed()};
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator/(int y, const month_weekday& mwd) NOEXCEPT
-{
-    return year(y) / mwd;
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator/(const month_weekday& mwd, const year& y) NOEXCEPT
-{
-    return y / mwd;
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator/(const month_weekday& mwd, int y) NOEXCEPT
-{
-    return year(y) / mwd;
-}
-
-// year_month_weekday_last from operator/()
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator/(const year_month& ym, const weekday_last& wdl) NOEXCEPT
-{
-    return {ym.year(), ym.month(), wdl};
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator/(const year& y, const month_weekday_last& mwdl) NOEXCEPT
-{
-    return {y, mwdl.month(), mwdl.weekday_last()};
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator/(int y, const month_weekday_last& mwdl) NOEXCEPT
-{
-    return year(y) / mwdl;
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator/(const month_weekday_last& mwdl, const year& y) NOEXCEPT
-{
-    return y / mwdl;
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator/(const month_weekday_last& mwdl, int y) NOEXCEPT
-{
-    return year(y) / mwdl;
-}
-
-}  // namespace islamic
-
-#endif  // ISLAMIC_H




diff --git a/src/libs/date/includes/date/iso_week.h b/src/libs/date/includes/date/iso_week.h
deleted file mode 100644
index 4a0a4a9b9247a02a7eca319f7568d8a442be7afe..0000000000000000000000000000000000000000
--- a/src/libs/date/includes/date/iso_week.h
+++ /dev/null
@@ -1,1751 +0,0 @@
-#ifndef ISO_WEEK_H
-#define ISO_WEEK_H
-
-// The MIT License (MIT)
-//
-// Copyright (c) 2015, 2016, 2017 Howard Hinnant
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-#include "date.h"
-
-#include <climits>
-
-namespace iso_week
-{
-
-// y/wn/wd
-// wn/wd/y
-// wd/wn/y
-
-using days = date::days;
-using weeks = date::weeks;
-using years = date::years;
-
-// time_point
-
-using sys_days = date::sys_days;
-using local_days = date::local_days;
-
-// types
-
-struct last_week
-{
-    explicit last_week() = default;
-};
-
-class weekday;
-class weeknum;
-class year;
-
-class year_weeknum;
-class year_lastweek;
-class weeknum_weekday;
-class lastweek_weekday;
-
-class year_weeknum_weekday;
-class year_lastweek_weekday;
-
-// date composition operators
-
-CONSTCD11 year_weeknum operator/(const year& y, const weeknum& wn) NOEXCEPT;
-CONSTCD11 year_weeknum operator/(const year& y, int            wn) NOEXCEPT;
-
-CONSTCD11 year_lastweek operator/(const year& y, last_week      wn) NOEXCEPT;
-
-CONSTCD11 weeknum_weekday operator/(const weeknum& wn, const weekday& wd) NOEXCEPT;
-CONSTCD11 weeknum_weekday operator/(const weeknum& wn, int            wd) NOEXCEPT;
-CONSTCD11 weeknum_weekday operator/(const weekday& wd, const weeknum& wn) NOEXCEPT;
-CONSTCD11 weeknum_weekday operator/(const weekday& wd, int            wn) NOEXCEPT;
-
-CONSTCD11 lastweek_weekday operator/(const last_week& wn, const weekday& wd) NOEXCEPT;
-CONSTCD11 lastweek_weekday operator/(const last_week& wn, int            wd) NOEXCEPT;
-CONSTCD11 lastweek_weekday operator/(const weekday& wd, const last_week& wn) NOEXCEPT;
-
-CONSTCD11 year_weeknum_weekday operator/(const year_weeknum& ywn, const weekday& wd) NOEXCEPT;
-CONSTCD11 year_weeknum_weekday operator/(const year_weeknum& ywn, int            wd) NOEXCEPT;
-CONSTCD11 year_weeknum_weekday operator/(const weeknum_weekday& wnwd, const year& y) NOEXCEPT;
-CONSTCD11 year_weeknum_weekday operator/(const weeknum_weekday& wnwd, int         y) NOEXCEPT;
-
-CONSTCD11 year_lastweek_weekday operator/(const year_lastweek& ylw, const weekday& wd) NOEXCEPT;
-CONSTCD11 year_lastweek_weekday operator/(const year_lastweek& ylw, int            wd) NOEXCEPT;
-
-CONSTCD11 year_lastweek_weekday operator/(const lastweek_weekday& lwwd, const year& y) NOEXCEPT;
-CONSTCD11 year_lastweek_weekday operator/(const lastweek_weekday& lwwd, int         y) NOEXCEPT;
-
-// weekday
-
-class weekday
-{
-    unsigned char wd_;
-public:
-    explicit CONSTCD11 weekday(unsigned wd) NOEXCEPT;
-    CONSTCD11 weekday(date::weekday wd) NOEXCEPT;
-    explicit weekday(int) = delete;
-    CONSTCD11 weekday(const sys_days& dp) NOEXCEPT;
-    CONSTCD11 explicit weekday(const local_days& dp) NOEXCEPT;
-
-    weekday& operator++()    NOEXCEPT;
-    weekday  operator++(int) NOEXCEPT;
-    weekday& operator--()    NOEXCEPT;
-    weekday  operator--(int) NOEXCEPT;
-
-    weekday& operator+=(const days& d) NOEXCEPT;
-    weekday& operator-=(const days& d) NOEXCEPT;
-
-    CONSTCD11 explicit operator unsigned() const NOEXCEPT;
-    CONSTCD11 operator date::weekday() const NOEXCEPT;
-    CONSTCD11 bool ok() const NOEXCEPT;
-
-private:
-    static CONSTCD11 unsigned char weekday_from_days(int z) NOEXCEPT;
-    static CONSTCD11 unsigned char to_iso_encoding(unsigned char) NOEXCEPT;
-    static CONSTCD11 unsigned from_iso_encoding(unsigned) NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const weekday& x, const weekday& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const weekday& x, const weekday& y) NOEXCEPT;
-
-CONSTCD14 weekday operator+(const weekday& x, const days&    y) NOEXCEPT;
-CONSTCD14 weekday operator+(const days&    x, const weekday& y) NOEXCEPT;
-CONSTCD14 weekday operator-(const weekday& x, const days&    y) NOEXCEPT;
-CONSTCD14 days    operator-(const weekday& x, const weekday& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday& wd);
-
-// year
-
-class year
-{
-    short y_;
-
-public:
-    explicit CONSTCD11 year(int y) NOEXCEPT;
-
-    year& operator++()    NOEXCEPT;
-    year  operator++(int) NOEXCEPT;
-    year& operator--()    NOEXCEPT;
-    year  operator--(int) NOEXCEPT;
-
-    year& operator+=(const years& y) NOEXCEPT;
-    year& operator-=(const years& y) NOEXCEPT;
-
-    CONSTCD11 explicit operator int() const NOEXCEPT;
-    CONSTCD11 bool ok() const NOEXCEPT;
-
-    static CONSTCD11 year min() NOEXCEPT;
-    static CONSTCD11 year max() NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator< (const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator> (const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const year& x, const year& y) NOEXCEPT;
-
-CONSTCD11 year  operator+(const year&  x, const years& y) NOEXCEPT;
-CONSTCD11 year  operator+(const years& x, const year&  y) NOEXCEPT;
-CONSTCD11 year  operator-(const year&  x, const years& y) NOEXCEPT;
-CONSTCD11 years operator-(const year&  x, const year&  y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year& y);
-
-// weeknum
-
-class weeknum
-{
-    unsigned char wn_;
-
-public:
-    explicit CONSTCD11 weeknum(unsigned wn) NOEXCEPT;
-
-    weeknum& operator++()    NOEXCEPT;
-    weeknum  operator++(int) NOEXCEPT;
-    weeknum& operator--()    NOEXCEPT;
-    weeknum  operator--(int) NOEXCEPT;
-
-    weeknum& operator+=(const weeks& y) NOEXCEPT;
-    weeknum& operator-=(const weeks& y) NOEXCEPT;
-
-    CONSTCD11 explicit operator unsigned() const NOEXCEPT;
-    CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const weeknum& x, const weeknum& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const weeknum& x, const weeknum& y) NOEXCEPT;
-CONSTCD11 bool operator< (const weeknum& x, const weeknum& y) NOEXCEPT;
-CONSTCD11 bool operator> (const weeknum& x, const weeknum& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const weeknum& x, const weeknum& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const weeknum& x, const weeknum& y) NOEXCEPT;
-
-CONSTCD11 weeknum  operator+(const weeknum& x, const weeks&   y) NOEXCEPT;
-CONSTCD11 weeknum  operator+(const weeks&   x, const weeknum& y) NOEXCEPT;
-CONSTCD11 weeknum  operator-(const weeknum& x, const weeks&   y) NOEXCEPT;
-CONSTCD11 weeks    operator-(const weeknum& x, const weeknum& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weeknum& wn);
-
-// year_weeknum
-
-class year_weeknum
-{
-    iso_week::year    y_;
-    iso_week::weeknum wn_;
-
-public:
-    CONSTCD11 year_weeknum(const iso_week::year& y, const iso_week::weeknum& wn) NOEXCEPT;
-
-    CONSTCD11 iso_week::year    year()    const NOEXCEPT;
-    CONSTCD11 iso_week::weeknum weeknum() const NOEXCEPT;
-
-    year_weeknum& operator+=(const years& dy) NOEXCEPT;
-    year_weeknum& operator-=(const years& dy) NOEXCEPT;
-
-    CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const year_weeknum& x, const year_weeknum& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const year_weeknum& x, const year_weeknum& y) NOEXCEPT;
-CONSTCD11 bool operator< (const year_weeknum& x, const year_weeknum& y) NOEXCEPT;
-CONSTCD11 bool operator> (const year_weeknum& x, const year_weeknum& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const year_weeknum& x, const year_weeknum& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const year_weeknum& x, const year_weeknum& y) NOEXCEPT;
-
-CONSTCD11 year_weeknum operator+(const year_weeknum& ym, const years& dy) NOEXCEPT;
-CONSTCD11 year_weeknum operator+(const years& dy, const year_weeknum& ym) NOEXCEPT;
-CONSTCD11 year_weeknum operator-(const year_weeknum& ym, const years& dy) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_weeknum& ym);
-
-// year_lastweek
-
-class year_lastweek
-{
-    iso_week::year    y_;
-
-public:
-    CONSTCD11 explicit year_lastweek(const iso_week::year& y) NOEXCEPT;
-
-    CONSTCD11 iso_week::year    year()    const NOEXCEPT;
-    CONSTCD14 iso_week::weeknum weeknum() const NOEXCEPT;
-
-    year_lastweek& operator+=(const years& dy) NOEXCEPT;
-    year_lastweek& operator-=(const years& dy) NOEXCEPT;
-
-    CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const year_lastweek& x, const year_lastweek& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const year_lastweek& x, const year_lastweek& y) NOEXCEPT;
-CONSTCD11 bool operator< (const year_lastweek& x, const year_lastweek& y) NOEXCEPT;
-CONSTCD11 bool operator> (const year_lastweek& x, const year_lastweek& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const year_lastweek& x, const year_lastweek& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const year_lastweek& x, const year_lastweek& y) NOEXCEPT;
-
-CONSTCD11 year_lastweek operator+(const year_lastweek& ym, const years& dy) NOEXCEPT;
-CONSTCD11 year_lastweek operator+(const years& dy, const year_lastweek& ym) NOEXCEPT;
-CONSTCD11 year_lastweek operator-(const year_lastweek& ym, const years& dy) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_lastweek& ym);
-
-// weeknum_weekday
-
-class weeknum_weekday
-{
-    iso_week::weeknum wn_;
-    iso_week::weekday wd_;
-
-public:
-    CONSTCD11 weeknum_weekday(const iso_week::weeknum& wn,
-                              const iso_week::weekday& wd) NOEXCEPT;
-
-    CONSTCD11 iso_week::weeknum weeknum() const NOEXCEPT;
-    CONSTCD11 iso_week::weekday weekday() const NOEXCEPT;
-
-    CONSTCD14 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const weeknum_weekday& x, const weeknum_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const weeknum_weekday& x, const weeknum_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator< (const weeknum_weekday& x, const weeknum_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator> (const weeknum_weekday& x, const weeknum_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const weeknum_weekday& x, const weeknum_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const weeknum_weekday& x, const weeknum_weekday& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weeknum_weekday& md);
-
-// lastweek_weekday
-
-class lastweek_weekday
-{
-    iso_week::weekday wd_;
-
-public:
-    CONSTCD11 explicit lastweek_weekday(const iso_week::weekday& wd) NOEXCEPT;
-
-    CONSTCD11 iso_week::weekday weekday() const NOEXCEPT;
-
-    CONSTCD14 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const lastweek_weekday& x, const lastweek_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const lastweek_weekday& x, const lastweek_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator< (const lastweek_weekday& x, const lastweek_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator> (const lastweek_weekday& x, const lastweek_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const lastweek_weekday& x, const lastweek_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const lastweek_weekday& x, const lastweek_weekday& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const lastweek_weekday& md);
-
-// year_lastweek_weekday
-
-class year_lastweek_weekday
-{
-    iso_week::year    y_;
-    iso_week::weekday wd_;
-
-public:
-    CONSTCD11 year_lastweek_weekday(const iso_week::year& y,
-                                    const iso_week::weekday& wd) NOEXCEPT;
-
-    year_lastweek_weekday& operator+=(const years& y) NOEXCEPT;
-    year_lastweek_weekday& operator-=(const years& y) NOEXCEPT;
-
-    CONSTCD11 iso_week::year    year()    const NOEXCEPT;
-    CONSTCD14 iso_week::weeknum weeknum() const NOEXCEPT;
-    CONSTCD11 iso_week::weekday weekday() const NOEXCEPT;
-
-    CONSTCD14 operator sys_days() const NOEXCEPT;
-    CONSTCD14 explicit operator local_days() const NOEXCEPT;
-    CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const year_lastweek_weekday& x, const year_lastweek_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const year_lastweek_weekday& x, const year_lastweek_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator< (const year_lastweek_weekday& x, const year_lastweek_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator> (const year_lastweek_weekday& x, const year_lastweek_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const year_lastweek_weekday& x, const year_lastweek_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const year_lastweek_weekday& x, const year_lastweek_weekday& y) NOEXCEPT;
-
-CONSTCD11 year_lastweek_weekday operator+(const year_lastweek_weekday& ywnwd, const years& y) NOEXCEPT;
-CONSTCD11 year_lastweek_weekday operator+(const years& y, const year_lastweek_weekday& ywnwd) NOEXCEPT;
-CONSTCD11 year_lastweek_weekday operator-(const year_lastweek_weekday& ywnwd, const years& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_lastweek_weekday& ywnwd);
-
-// class year_weeknum_weekday
-
-class year_weeknum_weekday
-{
-    iso_week::year    y_;
-    iso_week::weeknum wn_;
-    iso_week::weekday wd_;
-
-public:
-    CONSTCD11 year_weeknum_weekday(const iso_week::year& y, const iso_week::weeknum& wn,
-                                   const iso_week::weekday& wd) NOEXCEPT;
-    CONSTCD14 year_weeknum_weekday(const year_lastweek_weekday& ylwwd) NOEXCEPT;
-    CONSTCD14 year_weeknum_weekday(const sys_days& dp) NOEXCEPT;
-    CONSTCD14 explicit year_weeknum_weekday(const local_days& dp) NOEXCEPT;
-
-    year_weeknum_weekday& operator+=(const years& y) NOEXCEPT;
-    year_weeknum_weekday& operator-=(const years& y) NOEXCEPT;
-
-    CONSTCD11 iso_week::year    year()    const NOEXCEPT;
-    CONSTCD11 iso_week::weeknum weeknum() const NOEXCEPT;
-    CONSTCD11 iso_week::weekday weekday() const NOEXCEPT;
-
-    CONSTCD14 operator sys_days() const NOEXCEPT;
-    CONSTCD14 explicit operator local_days() const NOEXCEPT;
-    CONSTCD14 bool ok() const NOEXCEPT;
-
-private:
-    static CONSTCD14 year_weeknum_weekday from_days(days dp) NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const year_weeknum_weekday& x, const year_weeknum_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const year_weeknum_weekday& x, const year_weeknum_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator< (const year_weeknum_weekday& x, const year_weeknum_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator> (const year_weeknum_weekday& x, const year_weeknum_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const year_weeknum_weekday& x, const year_weeknum_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const year_weeknum_weekday& x, const year_weeknum_weekday& y) NOEXCEPT;
-
-CONSTCD11 year_weeknum_weekday operator+(const year_weeknum_weekday& ywnwd, const years& y) NOEXCEPT;
-CONSTCD11 year_weeknum_weekday operator+(const years& y, const year_weeknum_weekday& ywnwd) NOEXCEPT;
-CONSTCD11 year_weeknum_weekday operator-(const year_weeknum_weekday& ywnwd, const years& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_weeknum_weekday& ywnwd);
-
-//----------------+
-// Implementation |
-//----------------+
-
-// weekday
-
-CONSTCD11
-inline
-unsigned char
-weekday::to_iso_encoding(unsigned char z) NOEXCEPT
-{
-    return z != 0 ? z : (unsigned char)7;
-}
-
-CONSTCD11
-inline
-unsigned
-weekday::from_iso_encoding(unsigned z) NOEXCEPT
-{
-    return z != 7 ? z : 0u;
-}
-
-CONSTCD11
-inline
-unsigned char
-weekday::weekday_from_days(int z) NOEXCEPT
-{
-    return to_iso_encoding(static_cast<unsigned char>(static_cast<unsigned>(
-        z >= -4 ? (z+4) % 7 : (z+5) % 7 + 6)));
-}
-
-CONSTCD11
-inline
-weekday::weekday(unsigned wd) NOEXCEPT
-    : wd_(static_cast<decltype(wd_)>(wd))
-    {}
-
-CONSTCD11
-inline
-weekday::weekday(date::weekday wd) NOEXCEPT
-    : wd_(wd.iso_encoding())
-    {}
-
-CONSTCD11
-inline
-weekday::weekday(const sys_days& dp) NOEXCEPT
-    : wd_(weekday_from_days(dp.time_since_epoch().count()))
-    {}
-
-CONSTCD11
-inline
-weekday::weekday(const local_days& dp) NOEXCEPT
-    : wd_(weekday_from_days(dp.time_since_epoch().count()))
-    {}
-
-inline weekday& weekday::operator++() NOEXCEPT {if (++wd_ == 8) wd_ = 1; return *this;}
-inline weekday weekday::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;}
-inline weekday& weekday::operator--() NOEXCEPT {if (wd_-- == 1) wd_ = 7; return *this;}
-inline weekday weekday::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;}
-
-inline
-weekday&
-weekday::operator+=(const days& d) NOEXCEPT
-{
-    *this = *this + d;
-    return *this;
-}
-
-inline
-weekday&
-weekday::operator-=(const days& d) NOEXCEPT
-{
-    *this = *this - d;
-    return *this;
-}
-
-CONSTCD11
-inline
-weekday::operator unsigned() const NOEXCEPT
-{
-    return wd_;
-}
-
-CONSTCD11
-inline
-weekday::operator date::weekday() const NOEXCEPT
-{
-    return date::weekday{from_iso_encoding(unsigned{wd_})};
-}
-
-CONSTCD11 inline bool weekday::ok() const NOEXCEPT {return 1 <= wd_ && wd_ <= 7;}
-
-CONSTCD11
-inline
-bool
-operator==(const weekday& x, const weekday& y) NOEXCEPT
-{
-    return static_cast<unsigned>(x) == static_cast<unsigned>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const weekday& x, const weekday& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-CONSTCD14
-inline
-days
-operator-(const weekday& x, const weekday& y) NOEXCEPT
-{
-    auto const diff = static_cast<unsigned>(x) - static_cast<unsigned>(y);
-    return days{diff <= 6 ? diff : diff + 7};
-}
-
-CONSTCD14
-inline
-weekday
-operator+(const weekday& x, const days& y) NOEXCEPT
-{
-    auto const wdu = static_cast<long long>(static_cast<unsigned>(x) - 1u) + y.count();
-    auto const wk = (wdu >= 0 ? wdu : wdu-6) / 7;
-    return weekday{static_cast<unsigned>(wdu - wk * 7) + 1u};
-}
-
-CONSTCD14
-inline
-weekday
-operator+(const days& x, const weekday& y) NOEXCEPT
-{
-    return y + x;
-}
-
-CONSTCD14
-inline
-weekday
-operator-(const weekday& x, const days& y) NOEXCEPT
-{
-    return x + -y;
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday& wd)
-{
-    switch (static_cast<unsigned>(wd))
-    {
-    case 7:
-        os << "Sun";
-        break;
-    case 1:
-        os << "Mon";
-        break;
-    case 2:
-        os << "Tue";
-        break;
-    case 3:
-        os << "Wed";
-        break;
-    case 4:
-        os << "Thu";
-        break;
-    case 5:
-        os << "Fri";
-        break;
-    case 6:
-        os << "Sat";
-        break;
-    default:
-        os << static_cast<unsigned>(wd) << " is not a valid weekday";
-        break;
-    }
-    return os;
-}
-
-// year
-
-CONSTCD11 inline year::year(int y) NOEXCEPT : y_(static_cast<decltype(y_)>(y)) {}
-inline year& year::operator++() NOEXCEPT {++y_; return *this;}
-inline year year::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;}
-inline year& year::operator--() NOEXCEPT {--y_; return *this;}
-inline year year::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;}
-inline year& year::operator+=(const years& y) NOEXCEPT {*this = *this + y; return *this;}
-inline year& year::operator-=(const years& y) NOEXCEPT {*this = *this - y; return *this;}
-
-CONSTCD11 inline year::operator int() const NOEXCEPT {return y_;}
-CONSTCD11 inline bool year::ok() const NOEXCEPT {return min() <= *this && *this <= max();}
-
-CONSTCD11
-inline
-year
-year::min() NOEXCEPT
-{
-    using std::chrono::seconds;
-    using std::chrono::minutes;
-    using std::chrono::hours;
-    using std::chrono::duration_cast;
-    static_assert(sizeof(seconds)*CHAR_BIT >= 41, "seconds may overflow");
-    static_assert(sizeof(hours)*CHAR_BIT >= 30, "hours may overflow");
-    return sizeof(minutes)*CHAR_BIT < 34 ?
-        year{1970} + duration_cast<years>(minutes::min()) :
-        year{std::numeric_limits<short>::min()};
-}
-
-CONSTCD11
-inline
-year
-year::max() NOEXCEPT
-{
-    using std::chrono::seconds;
-    using std::chrono::minutes;
-    using std::chrono::hours;
-    using std::chrono::duration_cast;
-    static_assert(sizeof(seconds)*CHAR_BIT >= 41, "seconds may overflow");
-    static_assert(sizeof(hours)*CHAR_BIT >= 30, "hours may overflow");
-    return sizeof(minutes)*CHAR_BIT < 34 ?
-        year{1969} + duration_cast<years>(minutes::max()) :
-        year{std::numeric_limits<short>::max()};
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year& x, const year& y) NOEXCEPT
-{
-    return static_cast<int>(x) == static_cast<int>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year& x, const year& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const year& x, const year& y) NOEXCEPT
-{
-    return static_cast<int>(x) < static_cast<int>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator>(const year& x, const year& y) NOEXCEPT
-{
-    return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const year& x, const year& y) NOEXCEPT
-{
-    return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const year& x, const year& y) NOEXCEPT
-{
-    return !(x < y);
-}
-
-CONSTCD11
-inline
-years
-operator-(const year& x, const year& y) NOEXCEPT
-{
-    return years{static_cast<int>(x) - static_cast<int>(y)};
-}
-
-CONSTCD11
-inline
-year
-operator+(const year& x, const years& y) NOEXCEPT
-{
-    return year{static_cast<int>(x) + y.count()};
-}
-
-CONSTCD11
-inline
-year
-operator+(const years& x, const year& y) NOEXCEPT
-{
-    return y + x;
-}
-
-CONSTCD11
-inline
-year
-operator-(const year& x, const years& y) NOEXCEPT
-{
-    return year{static_cast<int>(x) - y.count()};
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year& y)
-{
-    date::detail::save_ostream<CharT, Traits> _(os);
-    os.fill('0');
-    os.flags(std::ios::dec | std::ios::internal);
-    os.width(4 + (y < year{0}));
-    os << static_cast<int>(y);
-    return os;
-}
-
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
-inline namespace literals
-{
-
-CONSTCD11
-inline
-iso_week::year
-operator "" _y(unsigned long long y) NOEXCEPT
-{
-    return iso_week::year(static_cast<int>(y));
-}
-
-CONSTCD11
-inline
-iso_week::weeknum
-operator "" _w(unsigned long long wn) NOEXCEPT
-{
-    return iso_week::weeknum(static_cast<unsigned>(wn));
-}
-
-#endif  // !defined(_MSC_VER) || (_MSC_VER >= 1900)
-
-CONSTDATA iso_week::last_week last{};
-
-CONSTDATA iso_week::weekday sun{7u};
-CONSTDATA iso_week::weekday mon{1u};
-CONSTDATA iso_week::weekday tue{2u};
-CONSTDATA iso_week::weekday wed{3u};
-CONSTDATA iso_week::weekday thu{4u};
-CONSTDATA iso_week::weekday fri{5u};
-CONSTDATA iso_week::weekday sat{6u};
-
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
-}  // inline namespace literals
-#endif
-
-// weeknum
-
-CONSTCD11
-inline
-weeknum::weeknum(unsigned wn) NOEXCEPT
-    : wn_(static_cast<decltype(wn_)>(wn))
-    {}
-
-inline weeknum& weeknum::operator++() NOEXCEPT {++wn_; return *this;}
-inline weeknum weeknum::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;}
-inline weeknum& weeknum::operator--() NOEXCEPT {--wn_; return *this;}
-inline weeknum weeknum::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;}
-
-inline
-weeknum&
-weeknum::operator+=(const weeks& y) NOEXCEPT
-{
-    *this = *this + y;
-    return *this;
-}
-
-inline
-weeknum&
-weeknum::operator-=(const weeks& y) NOEXCEPT
-{
-    *this = *this - y;
-    return *this;
-}
-
-CONSTCD11 inline weeknum::operator unsigned() const NOEXCEPT {return wn_;}
-CONSTCD11 inline bool weeknum::ok() const NOEXCEPT {return 1 <= wn_ && wn_ <= 53;}
-
-CONSTCD11
-inline
-bool
-operator==(const weeknum& x, const weeknum& y) NOEXCEPT
-{
-    return static_cast<unsigned>(x) == static_cast<unsigned>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const weeknum& x, const weeknum& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const weeknum& x, const weeknum& y) NOEXCEPT
-{
-    return static_cast<unsigned>(x) < static_cast<unsigned>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator>(const weeknum& x, const weeknum& y) NOEXCEPT
-{
-    return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const weeknum& x, const weeknum& y) NOEXCEPT
-{
-    return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const weeknum& x, const weeknum& y) NOEXCEPT
-{
-    return !(x < y);
-}
-
-CONSTCD11
-inline
-weeks
-operator-(const weeknum& x, const weeknum& y) NOEXCEPT
-{
-    return weeks{static_cast<weeks::rep>(static_cast<unsigned>(x)) -
-                 static_cast<weeks::rep>(static_cast<unsigned>(y))};
-}
-
-CONSTCD11
-inline
-weeknum
-operator+(const weeknum& x, const weeks& y) NOEXCEPT
-{
-    return weeknum{static_cast<unsigned>(x) + static_cast<unsigned>(y.count())};
-}
-
-CONSTCD11
-inline
-weeknum
-operator+(const weeks& x, const weeknum& y) NOEXCEPT
-{
-    return y + x;
-}
-
-CONSTCD11
-inline
-weeknum
-operator-(const weeknum& x, const weeks& y) NOEXCEPT
-{
-    return x + -y;
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weeknum& wn)
-{
-    date::detail::save_ostream<CharT, Traits> _(os);
-    os << 'W';
-    os.fill('0');
-    os.flags(std::ios::dec | std::ios::right);
-    os.width(2);
-    os << static_cast<unsigned>(wn);
-    return os;
-}
-
-// year_weeknum
-
-CONSTCD11
-inline
-year_weeknum::year_weeknum(const iso_week::year& y, const iso_week::weeknum& wn) NOEXCEPT
-    : y_(y)
-    , wn_(wn)
-    {}
-
-CONSTCD11 inline year year_weeknum::year() const NOEXCEPT {return y_;}
-CONSTCD11 inline weeknum year_weeknum::weeknum() const NOEXCEPT {return wn_;}
-CONSTCD11 inline bool year_weeknum::ok() const NOEXCEPT
-{
-    return y_.ok() && 1u <= static_cast<unsigned>(wn_) && wn_ <= (y_/last).weeknum();
-}
-
-inline
-year_weeknum&
-year_weeknum::operator+=(const years& dy) NOEXCEPT
-{
-    *this = *this + dy;
-    return *this;
-}
-
-inline
-year_weeknum&
-year_weeknum::operator-=(const years& dy) NOEXCEPT
-{
-    *this = *this - dy;
-    return *this;
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year_weeknum& x, const year_weeknum& y) NOEXCEPT
-{
-    return x.year() == y.year() && x.weeknum() == y.weeknum();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year_weeknum& x, const year_weeknum& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const year_weeknum& x, const year_weeknum& y) NOEXCEPT
-{
-    return x.year() < y.year() ? true
-        : (x.year() > y.year() ? false
-        : (x.weeknum() < y.weeknum()));
-}
-
-CONSTCD11
-inline
-bool
-operator>(const year_weeknum& x, const year_weeknum& y) NOEXCEPT
-{
-    return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const year_weeknum& x, const year_weeknum& y) NOEXCEPT
-{
-    return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const year_weeknum& x, const year_weeknum& y) NOEXCEPT
-{
-    return !(x < y);
-}
-
-CONSTCD11
-inline
-year_weeknum
-operator+(const year_weeknum& ym, const years& dy) NOEXCEPT
-{
-    return (ym.year() + dy) / ym.weeknum();
-}
-
-CONSTCD11
-inline
-year_weeknum
-operator+(const years& dy, const year_weeknum& ym) NOEXCEPT
-{
-    return ym + dy;
-}
-
-CONSTCD11
-inline
-year_weeknum
-operator-(const year_weeknum& ym, const years& dy) NOEXCEPT
-{
-    return ym + -dy;
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_weeknum& ywn)
-{
-    return os << ywn.year() << '-' << ywn.weeknum();
-}
-
-
-// year_lastweek
-
-CONSTCD11
-inline
-year_lastweek::year_lastweek(const iso_week::year& y) NOEXCEPT
-    : y_(y)
-    {}
-
-CONSTCD11 inline year year_lastweek::year() const NOEXCEPT {return y_;}
-
-CONSTCD14
-inline
-weeknum
-year_lastweek::weeknum() const NOEXCEPT
-{
-    const auto y = date::year{static_cast<int>(y_)};
-    const auto s0 = sys_days((y-years{1})/12/date::thu[date::last]);
-    const auto s1 = sys_days(y/12/date::thu[date::last]);
-    return iso_week::weeknum(static_cast<unsigned>(date::trunc<weeks>(s1-s0).count()));
-}
-
-CONSTCD11 inline bool year_lastweek::ok() const NOEXCEPT {return y_.ok();}
-
-inline
-year_lastweek&
-year_lastweek::operator+=(const years& dy) NOEXCEPT
-{
-    *this = *this + dy;
-    return *this;
-}
-
-inline
-year_lastweek&
-year_lastweek::operator-=(const years& dy) NOEXCEPT
-{
-    *this = *this - dy;
-    return *this;
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year_lastweek& x, const year_lastweek& y) NOEXCEPT
-{
-    return x.year() == y.year();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year_lastweek& x, const year_lastweek& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const year_lastweek& x, const year_lastweek& y) NOEXCEPT
-{
-    return x.year() < y.year();
-}
-
-CONSTCD11
-inline
-bool
-operator>(const year_lastweek& x, const year_lastweek& y) NOEXCEPT
-{
-    return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const year_lastweek& x, const year_lastweek& y) NOEXCEPT
-{
-    return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const year_lastweek& x, const year_lastweek& y) NOEXCEPT
-{
-    return !(x < y);
-}
-
-CONSTCD11
-inline
-year_lastweek
-operator+(const year_lastweek& ym, const years& dy) NOEXCEPT
-{
-    return year_lastweek{ym.year() + dy};
-}
-
-CONSTCD11
-inline
-year_lastweek
-operator+(const years& dy, const year_lastweek& ym) NOEXCEPT
-{
-    return ym + dy;
-}
-
-CONSTCD11
-inline
-year_lastweek
-operator-(const year_lastweek& ym, const years& dy) NOEXCEPT
-{
-    return ym + -dy;
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_lastweek& ywn)
-{
-    return os << ywn.year() << "-W last";
-}
-
-// weeknum_weekday
-
-CONSTCD11
-inline
-weeknum_weekday::weeknum_weekday(const iso_week::weeknum& wn,
-                                 const iso_week::weekday& wd) NOEXCEPT
-    : wn_(wn)
-    , wd_(wd)
-    {}
-
-CONSTCD11 inline weeknum weeknum_weekday::weeknum() const NOEXCEPT {return wn_;}
-CONSTCD11 inline weekday weeknum_weekday::weekday() const NOEXCEPT {return wd_;}
-
-CONSTCD14
-inline
-bool
-weeknum_weekday::ok() const NOEXCEPT
-{
-    return wn_.ok() && wd_.ok();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const weeknum_weekday& x, const weeknum_weekday& y) NOEXCEPT
-{
-    return x.weeknum() == y.weeknum() && x.weekday() == y.weekday();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const weeknum_weekday& x, const weeknum_weekday& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const weeknum_weekday& x, const weeknum_weekday& y) NOEXCEPT
-{
-    return x.weeknum() < y.weeknum() ? true
-        : (x.weeknum() > y.weeknum() ? false
-        : (static_cast<unsigned>(x.weekday()) < static_cast<unsigned>(y.weekday())));
-}
-
-CONSTCD11
-inline
-bool
-operator>(const weeknum_weekday& x, const weeknum_weekday& y) NOEXCEPT
-{
-    return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const weeknum_weekday& x, const weeknum_weekday& y) NOEXCEPT
-{
-    return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const weeknum_weekday& x, const weeknum_weekday& y) NOEXCEPT
-{
-    return !(x < y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weeknum_weekday& md)
-{
-    return os << md.weeknum() << '-' << md.weekday();
-}
-
-// lastweek_weekday
-
-CONSTCD11
-inline
-lastweek_weekday::lastweek_weekday(const iso_week::weekday& wd) NOEXCEPT
-    : wd_(wd)
-    {}
-
-CONSTCD11 inline weekday lastweek_weekday::weekday() const NOEXCEPT {return wd_;}
-
-CONSTCD14
-inline
-bool
-lastweek_weekday::ok() const NOEXCEPT
-{
-    return wd_.ok();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const lastweek_weekday& x, const lastweek_weekday& y) NOEXCEPT
-{
-    return x.weekday() == y.weekday();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const lastweek_weekday& x, const lastweek_weekday& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const lastweek_weekday& x, const lastweek_weekday& y) NOEXCEPT
-{
-    return static_cast<unsigned>(x.weekday()) < static_cast<unsigned>(y.weekday());
-}
-
-CONSTCD11
-inline
-bool
-operator>(const lastweek_weekday& x, const lastweek_weekday& y) NOEXCEPT
-{
-    return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const lastweek_weekday& x, const lastweek_weekday& y) NOEXCEPT
-{
-    return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const lastweek_weekday& x, const lastweek_weekday& y) NOEXCEPT
-{
-    return !(x < y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const lastweek_weekday& md)
-{
-    return os << "W last-" << md.weekday();
-}
-
-// year_lastweek_weekday
-
-CONSTCD11
-inline
-year_lastweek_weekday::year_lastweek_weekday(const iso_week::year& y,
-                                             const iso_week::weekday& wd) NOEXCEPT
-    : y_(y)
-    , wd_(wd)
-    {}
-
-inline
-year_lastweek_weekday&
-year_lastweek_weekday::operator+=(const years& y) NOEXCEPT
-{
-    *this = *this + y;
-    return *this;
-}
-
-inline
-year_lastweek_weekday&
-year_lastweek_weekday::operator-=(const years& y) NOEXCEPT
-{
-    *this = *this - y;
-    return *this;
-}
-
-CONSTCD11 inline year year_lastweek_weekday::year() const NOEXCEPT {return y_;}
-
-CONSTCD14
-inline
-weeknum
-year_lastweek_weekday::weeknum() const NOEXCEPT
-{
-    return (y_ / last).weeknum();
-}
-
-CONSTCD11 inline weekday year_lastweek_weekday::weekday() const NOEXCEPT {return wd_;}
-
-CONSTCD14
-inline
-year_lastweek_weekday::operator sys_days() const NOEXCEPT
-{
-    return sys_days(date::year{static_cast<int>(y_)}/date::dec/date::thu[date::last])
-         + (sun - thu) - (sun - wd_);
-}
-
-CONSTCD14
-inline
-year_lastweek_weekday::operator local_days() const NOEXCEPT
-{
-    return local_days(date::year{static_cast<int>(y_)}/date::dec/date::thu[date::last])
-         + (sun - thu) - (sun - wd_);
-}
-
-CONSTCD11
-inline
-bool
-year_lastweek_weekday::ok() const NOEXCEPT
-{
-    return y_.ok() && wd_.ok();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year_lastweek_weekday& x, const year_lastweek_weekday& y) NOEXCEPT
-{
-    return x.year() == y.year() && x.weekday() == y.weekday();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year_lastweek_weekday& x, const year_lastweek_weekday& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const year_lastweek_weekday& x, const year_lastweek_weekday& y) NOEXCEPT
-{
-    return x.year() < y.year() ? true
-        : (x.year() > y.year() ? false
-        : (static_cast<unsigned>(x.weekday()) < static_cast<unsigned>(y.weekday())));
-}
-
-CONSTCD11
-inline
-bool
-operator>(const year_lastweek_weekday& x, const year_lastweek_weekday& y) NOEXCEPT
-{
-    return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const year_lastweek_weekday& x, const year_lastweek_weekday& y) NOEXCEPT
-{
-    return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const year_lastweek_weekday& x, const year_lastweek_weekday& y) NOEXCEPT
-{
-    return !(x < y);
-}
-
-CONSTCD11
-inline
-year_lastweek_weekday
-operator+(const year_lastweek_weekday& ywnwd, const years& y)  NOEXCEPT
-{
-    return (ywnwd.year() + y) / last / ywnwd.weekday();
-}
-
-CONSTCD11
-inline
-year_lastweek_weekday
-operator+(const years& y, const year_lastweek_weekday& ywnwd)  NOEXCEPT
-{
-    return ywnwd + y;
-}
-
-CONSTCD11
-inline
-year_lastweek_weekday
-operator-(const year_lastweek_weekday& ywnwd, const years& y)  NOEXCEPT
-{
-    return ywnwd + -y;
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_lastweek_weekday& ywnwd)
-{
-    return os << ywnwd.year() << "-W last-" << ywnwd.weekday();
-}
-
-// year_weeknum_weekday
-
-CONSTCD11
-inline
-year_weeknum_weekday::year_weeknum_weekday(const iso_week::year& y,
-                                           const iso_week::weeknum& wn,
-                                           const iso_week::weekday& wd) NOEXCEPT
-    : y_(y)
-    , wn_(wn)
-    , wd_(wd)
-    {}
-
-CONSTCD14
-inline
-year_weeknum_weekday::year_weeknum_weekday(const year_lastweek_weekday& ylwwd) NOEXCEPT
-    : y_(ylwwd.year())
-    , wn_(ylwwd.weeknum())
-    , wd_(ylwwd.weekday())
-    {}
-
-CONSTCD14
-inline
-year_weeknum_weekday::year_weeknum_weekday(const sys_days& dp) NOEXCEPT
-    : year_weeknum_weekday(from_days(dp.time_since_epoch()))
-    {}
-
-CONSTCD14
-inline
-year_weeknum_weekday::year_weeknum_weekday(const local_days& dp) NOEXCEPT
-    : year_weeknum_weekday(from_days(dp.time_since_epoch()))
-    {}
-
-inline
-year_weeknum_weekday&
-year_weeknum_weekday::operator+=(const years& y) NOEXCEPT
-{
-    *this = *this + y;
-    return *this;
-}
-
-inline
-year_weeknum_weekday&
-year_weeknum_weekday::operator-=(const years& y) NOEXCEPT
-{
-    *this = *this - y;
-    return *this;
-}
-
-CONSTCD11 inline year year_weeknum_weekday::year() const NOEXCEPT {return y_;}
-CONSTCD11 inline weeknum year_weeknum_weekday::weeknum() const NOEXCEPT {return wn_;}
-CONSTCD11 inline weekday year_weeknum_weekday::weekday() const NOEXCEPT {return wd_;}
-
-CONSTCD14
-inline
-year_weeknum_weekday::operator sys_days() const NOEXCEPT
-{
-    return sys_days(date::year{static_cast<int>(y_)-1}/date::dec/date::thu[date::last])
-         + (date::mon - date::thu) + weeks{static_cast<unsigned>(wn_)-1} + (wd_ - mon);
-}
-
-CONSTCD14
-inline
-year_weeknum_weekday::operator local_days() const NOEXCEPT
-{
-    return local_days(date::year{static_cast<int>(y_)-1}/date::dec/date::thu[date::last])
-         + (date::mon - date::thu) + weeks{static_cast<unsigned>(wn_)-1} + (wd_ - mon);
-}
-
-CONSTCD14
-inline
-bool
-year_weeknum_weekday::ok() const NOEXCEPT
-{
-    return y_.ok() && wd_.ok() && iso_week::weeknum{1u} <= wn_ && wn_ <= year_lastweek{y_}.weeknum();
-}
-
-CONSTCD14
-inline
-year_weeknum_weekday
-year_weeknum_weekday::from_days(days d) NOEXCEPT
-{
-    const auto dp = sys_days{d};
-    const auto wd = iso_week::weekday{dp};
-    auto y = date::year_month_day{dp + days{3}}.year();
-    auto start = sys_days((y - date::years{1})/date::dec/date::thu[date::last]) + (mon-thu);
-    if (dp < start)
-    {
-        --y;
-        start = sys_days((y - date::years{1})/date::dec/date::thu[date::last]) + (mon-thu);
-    }
-    const auto wn = iso_week::weeknum(
-                       static_cast<unsigned>(date::trunc<weeks>(dp - start).count() + 1));
-    return {iso_week::year(static_cast<int>(y)), wn, wd};
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year_weeknum_weekday& x, const year_weeknum_weekday& y) NOEXCEPT
-{
-    return x.year() == y.year() && x.weeknum() == y.weeknum() && x.weekday() == y.weekday();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year_weeknum_weekday& x, const year_weeknum_weekday& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const year_weeknum_weekday& x, const year_weeknum_weekday& y) NOEXCEPT
-{
-    return x.year() < y.year() ? true
-        : (x.year() > y.year() ? false
-        : (x.weeknum() < y.weeknum() ? true
-        : (x.weeknum() > y.weeknum() ? false
-        : (static_cast<unsigned>(x.weekday()) < static_cast<unsigned>(y.weekday())))));
-}
-
-CONSTCD11
-inline
-bool
-operator>(const year_weeknum_weekday& x, const year_weeknum_weekday& y) NOEXCEPT
-{
-    return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const year_weeknum_weekday& x, const year_weeknum_weekday& y) NOEXCEPT
-{
-    return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const year_weeknum_weekday& x, const year_weeknum_weekday& y) NOEXCEPT
-{
-    return !(x < y);
-}
-
-CONSTCD11
-inline
-year_weeknum_weekday
-operator+(const year_weeknum_weekday& ywnwd, const years& y)  NOEXCEPT
-{
-    return (ywnwd.year() + y) / ywnwd.weeknum() / ywnwd.weekday();
-}
-
-CONSTCD11
-inline
-year_weeknum_weekday
-operator+(const years& y, const year_weeknum_weekday& ywnwd)  NOEXCEPT
-{
-    return ywnwd + y;
-}
-
-CONSTCD11
-inline
-year_weeknum_weekday
-operator-(const year_weeknum_weekday& ywnwd, const years& y)  NOEXCEPT
-{
-    return ywnwd + -y;
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_weeknum_weekday& ywnwd)
-{
-    return os << ywnwd.year() << '-' << ywnwd.weeknum() << '-' << ywnwd.weekday();
-}
-
-// date composition operators
-
-CONSTCD11
-inline
-year_weeknum
-operator/(const year& y, const weeknum& wn) NOEXCEPT
-{
-    return {y, wn};
-}
-
-CONSTCD11
-inline
-year_weeknum
-operator/(const year& y, int wn) NOEXCEPT
-{
-    return y/weeknum(static_cast<unsigned>(wn));
-}
-
-CONSTCD11
-inline
-year_lastweek
-operator/(const year& y, last_week) NOEXCEPT
-{
-    return year_lastweek{y};
-}
-
-CONSTCD11
-inline
-weeknum_weekday
-operator/(const weeknum& wn, const weekday& wd) NOEXCEPT
-{
-    return {wn, wd};
-}
-
-CONSTCD11
-inline
-weeknum_weekday
-operator/(const weeknum& wn, int wd) NOEXCEPT
-{
-    return wn/weekday{static_cast<unsigned>(wd)};
-}
-
-CONSTCD11
-inline
-weeknum_weekday
-operator/(const weekday& wd, const weeknum& wn) NOEXCEPT
-{
-    return wn/wd;
-}
-
-CONSTCD11
-inline
-weeknum_weekday
-operator/(const weekday& wd, int wn) NOEXCEPT
-{
-    return weeknum{static_cast<unsigned>(wn)}/wd;
-}
-
-CONSTCD11
-inline
-lastweek_weekday
-operator/(const last_week&, const weekday& wd) NOEXCEPT
-{
-    return lastweek_weekday{wd};
-}
-
-CONSTCD11
-inline
-lastweek_weekday
-operator/(const last_week& wn, int wd) NOEXCEPT
-{
-    return wn / weekday{static_cast<unsigned>(wd)};
-}
-
-CONSTCD11
-inline
-lastweek_weekday
-operator/(const weekday& wd, const last_week& wn) NOEXCEPT
-{
-    return wn / wd;
-}
-
-CONSTCD11
-inline
-year_weeknum_weekday
-operator/(const year_weeknum& ywn, const weekday& wd) NOEXCEPT
-{
-    return {ywn.year(), ywn.weeknum(), wd};
-}
-
-CONSTCD11
-inline
-year_weeknum_weekday
-operator/(const year_weeknum& ywn, int wd) NOEXCEPT
-{
-    return ywn / weekday(static_cast<unsigned>(wd));
-}
-
-CONSTCD11
-inline
-year_weeknum_weekday
-operator/(const weeknum_weekday& wnwd, const year& y) NOEXCEPT
-{
-    return {y, wnwd.weeknum(), wnwd.weekday()};
-}
-
-CONSTCD11
-inline
-year_weeknum_weekday
-operator/(const weeknum_weekday& wnwd, int y) NOEXCEPT
-{
-    return wnwd / year{y};
-}
-
-CONSTCD11
-inline
-year_lastweek_weekday
-operator/(const year_lastweek& ylw, const weekday& wd) NOEXCEPT
-{
-    return {ylw.year(), wd};
-}
-
-CONSTCD11
-inline
-year_lastweek_weekday
-operator/(const year_lastweek& ylw, int wd) NOEXCEPT
-{
-    return ylw / weekday(static_cast<unsigned>(wd));
-}
-
-CONSTCD11
-inline
-year_lastweek_weekday
-operator/(const lastweek_weekday& lwwd, const year& y) NOEXCEPT
-{
-    return {y, lwwd.weekday()};
-}
-
-CONSTCD11
-inline
-year_lastweek_weekday
-operator/(const lastweek_weekday& lwwd, int y) NOEXCEPT
-{
-    return lwwd / year{y};
-}
-
-}  // namespace iso_week
-
-#endif  // ISO_WEEK_H




diff --git a/src/libs/date/includes/date/julian.h b/src/libs/date/includes/date/julian.h
deleted file mode 100644
index 7869792ba59793df505c37c0b5a5845fa3929538..0000000000000000000000000000000000000000
--- a/src/libs/date/includes/date/julian.h
+++ /dev/null
@@ -1,3046 +0,0 @@
-#ifndef JULIAN_H
-#define JULIAN_H
-
-// The MIT License (MIT)
-//
-// Copyright (c) 2016 Howard Hinnant
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-//
-// Our apologies.  When the previous paragraph was written, lowercase had not yet
-// been invented (that would involve another several millennia of evolution).
-// We did not mean to shout.
-
-#include "date.h"
-
-namespace julian
-{
-
-// durations
-
-using days = date::days;
-
-using weeks = date::weeks;
-
-using years = std::chrono::duration
-    <int, date::detail::ratio_multiply<std::ratio<1461, 4>, days::period>>;
-
-using months = std::chrono::duration
-    <int, date::detail::ratio_divide<years::period, std::ratio<12>>>;
-
-// time_point
-
-using sys_days   = date::sys_days;
-using local_days = date::local_days;
-
-// types
-
-struct last_spec
-{
-    explicit last_spec() = default;
-};
-
-class day;
-class month;
-class year;
-
-class weekday;
-class weekday_indexed;
-class weekday_last;
-
-class month_day;
-class month_day_last;
-class month_weekday;
-class month_weekday_last;
-
-class year_month;
-
-class year_month_day;
-class year_month_day_last;
-class year_month_weekday;
-class year_month_weekday_last;
-
-// date composition operators
-
-CONSTCD11 year_month operator/(const year& y, const month& m) NOEXCEPT;
-CONSTCD11 year_month operator/(const year& y, int          m) NOEXCEPT;
-
-CONSTCD11 month_day operator/(const day& d, const month& m) NOEXCEPT;
-CONSTCD11 month_day operator/(const day& d, int          m) NOEXCEPT;
-CONSTCD11 month_day operator/(const month& m, const day& d) NOEXCEPT;
-CONSTCD11 month_day operator/(const month& m, int        d) NOEXCEPT;
-CONSTCD11 month_day operator/(int          m, const day& d) NOEXCEPT;
-
-CONSTCD11 month_day_last operator/(const month& m, last_spec) NOEXCEPT;
-CONSTCD11 month_day_last operator/(int          m, last_spec) NOEXCEPT;
-CONSTCD11 month_day_last operator/(last_spec, const month& m) NOEXCEPT;
-CONSTCD11 month_day_last operator/(last_spec, int          m) NOEXCEPT;
-
-CONSTCD11 month_weekday operator/(const month& m, const weekday_indexed& wdi) NOEXCEPT;
-CONSTCD11 month_weekday operator/(int          m, const weekday_indexed& wdi) NOEXCEPT;
-CONSTCD11 month_weekday operator/(const weekday_indexed& wdi, const month& m) NOEXCEPT;
-CONSTCD11 month_weekday operator/(const weekday_indexed& wdi, int          m) NOEXCEPT;
-
-CONSTCD11 month_weekday_last operator/(const month& m, const weekday_last& wdl) NOEXCEPT;
-CONSTCD11 month_weekday_last operator/(int          m, const weekday_last& wdl) NOEXCEPT;
-CONSTCD11 month_weekday_last operator/(const weekday_last& wdl, const month& m) NOEXCEPT;
-CONSTCD11 month_weekday_last operator/(const weekday_last& wdl, int          m) NOEXCEPT;
-
-CONSTCD11 year_month_day operator/(const year_month& ym, const day& d) NOEXCEPT;
-CONSTCD11 year_month_day operator/(const year_month& ym, int        d) NOEXCEPT;
-CONSTCD11 year_month_day operator/(const year& y, const month_day& md) NOEXCEPT;
-CONSTCD11 year_month_day operator/(int         y, const month_day& md) NOEXCEPT;
-CONSTCD11 year_month_day operator/(const month_day& md, const year& y) NOEXCEPT;
-CONSTCD11 year_month_day operator/(const month_day& md, int         y) NOEXCEPT;
-
-CONSTCD11
-    year_month_day_last operator/(const year_month& ym,   last_spec) NOEXCEPT;
-CONSTCD11
-    year_month_day_last operator/(const year& y, const month_day_last& mdl) NOEXCEPT;
-CONSTCD11
-    year_month_day_last operator/(int         y, const month_day_last& mdl) NOEXCEPT;
-CONSTCD11
-    year_month_day_last operator/(const month_day_last& mdl, const year& y) NOEXCEPT;
-CONSTCD11
-    year_month_day_last operator/(const month_day_last& mdl, int         y) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator/(const year_month& ym, const weekday_indexed& wdi) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator/(const year&        y, const month_weekday&   mwd) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator/(int                y, const month_weekday&   mwd) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator/(const month_weekday& mwd, const year&          y) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator/(const month_weekday& mwd, int                  y) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator/(const year_month& ym, const weekday_last& wdl) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator/(const year& y, const month_weekday_last& mwdl) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator/(int         y, const month_weekday_last& mwdl) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator/(const month_weekday_last& mwdl, const year& y) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator/(const month_weekday_last& mwdl, int         y) NOEXCEPT;
-
-// Detailed interface
-
-// day
-
-class day
-{
-    unsigned char d_;
-
-public:
-    explicit CONSTCD11 day(unsigned d) NOEXCEPT;
-
-    CONSTCD14 day& operator++()    NOEXCEPT;
-    CONSTCD14 day  operator++(int) NOEXCEPT;
-    CONSTCD14 day& operator--()    NOEXCEPT;
-    CONSTCD14 day  operator--(int) NOEXCEPT;
-
-    CONSTCD14 day& operator+=(const days& d) NOEXCEPT;
-    CONSTCD14 day& operator-=(const days& d) NOEXCEPT;
-
-    CONSTCD11 explicit operator unsigned() const NOEXCEPT;
-    CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const day& x, const day& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const day& x, const day& y) NOEXCEPT;
-CONSTCD11 bool operator< (const day& x, const day& y) NOEXCEPT;
-CONSTCD11 bool operator> (const day& x, const day& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const day& x, const day& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const day& x, const day& y) NOEXCEPT;
-
-CONSTCD11 day  operator+(const day&  x, const days& y) NOEXCEPT;
-CONSTCD11 day  operator+(const days& x, const day&  y) NOEXCEPT;
-CONSTCD11 day  operator-(const day&  x, const days& y) NOEXCEPT;
-CONSTCD11 days operator-(const day&  x, const day&  y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const day& d);
-
-// month
-
-class month
-{
-    unsigned char m_;
-
-public:
-    explicit CONSTCD11 month(unsigned m) NOEXCEPT;
-
-    CONSTCD14 month& operator++()    NOEXCEPT;
-    CONSTCD14 month  operator++(int) NOEXCEPT;
-    CONSTCD14 month& operator--()    NOEXCEPT;
-    CONSTCD14 month  operator--(int) NOEXCEPT;
-
-    CONSTCD14 month& operator+=(const months& m) NOEXCEPT;
-    CONSTCD14 month& operator-=(const months& m) NOEXCEPT;
-
-    CONSTCD11 explicit operator unsigned() const NOEXCEPT;
-    CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const month& x, const month& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const month& x, const month& y) NOEXCEPT;
-CONSTCD11 bool operator< (const month& x, const month& y) NOEXCEPT;
-CONSTCD11 bool operator> (const month& x, const month& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const month& x, const month& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const month& x, const month& y) NOEXCEPT;
-
-CONSTCD14 month  operator+(const month&  x, const months& y) NOEXCEPT;
-CONSTCD14 month  operator+(const months& x,  const month& y) NOEXCEPT;
-CONSTCD14 month  operator-(const month&  x, const months& y) NOEXCEPT;
-CONSTCD14 months operator-(const month&  x,  const month& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month& m);
-
-// year
-
-class year
-{
-    short y_;
-
-public:
-    explicit CONSTCD11 year(int y) NOEXCEPT;
-
-    CONSTCD14 year& operator++()    NOEXCEPT;
-    CONSTCD14 year  operator++(int) NOEXCEPT;
-    CONSTCD14 year& operator--()    NOEXCEPT;
-    CONSTCD14 year  operator--(int) NOEXCEPT;
-
-    CONSTCD14 year& operator+=(const years& y) NOEXCEPT;
-    CONSTCD14 year& operator-=(const years& y) NOEXCEPT;
-
-    CONSTCD11 bool is_leap() const NOEXCEPT;
-
-    CONSTCD11 explicit operator int() const NOEXCEPT;
-    CONSTCD11 bool ok() const NOEXCEPT;
-
-    static CONSTCD11 year min() NOEXCEPT;
-    static CONSTCD11 year max() NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator< (const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator> (const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const year& x, const year& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const year& x, const year& y) NOEXCEPT;
-
-CONSTCD11 year  operator+(const year&  x, const years& y) NOEXCEPT;
-CONSTCD11 year  operator+(const years& x, const year&  y) NOEXCEPT;
-CONSTCD11 year  operator-(const year&  x, const years& y) NOEXCEPT;
-CONSTCD11 years operator-(const year&  x, const year&  y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year& y);
-
-// weekday
-
-class weekday
-{
-    unsigned char wd_;
-public:
-    explicit CONSTCD11 weekday(unsigned wd) NOEXCEPT;
-    explicit weekday(int) = delete;
-    CONSTCD11 weekday(const sys_days& dp) NOEXCEPT;
-    CONSTCD11 explicit weekday(const local_days& dp) NOEXCEPT;
-
-    CONSTCD14 weekday& operator++()    NOEXCEPT;
-    CONSTCD14 weekday  operator++(int) NOEXCEPT;
-    CONSTCD14 weekday& operator--()    NOEXCEPT;
-    CONSTCD14 weekday  operator--(int) NOEXCEPT;
-
-    CONSTCD14 weekday& operator+=(const days& d) NOEXCEPT;
-    CONSTCD14 weekday& operator-=(const days& d) NOEXCEPT;
-
-    CONSTCD11 explicit operator unsigned() const NOEXCEPT;
-    CONSTCD11 bool ok() const NOEXCEPT;
-
-    CONSTCD11 weekday_indexed operator[](unsigned index) const NOEXCEPT;
-    CONSTCD11 weekday_last    operator[](last_spec)      const NOEXCEPT;
-
-private:
-    static CONSTCD11 unsigned char weekday_from_days(int z) NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const weekday& x, const weekday& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const weekday& x, const weekday& y) NOEXCEPT;
-
-CONSTCD14 weekday operator+(const weekday& x, const days&    y) NOEXCEPT;
-CONSTCD14 weekday operator+(const days&    x, const weekday& y) NOEXCEPT;
-CONSTCD14 weekday operator-(const weekday& x, const days&    y) NOEXCEPT;
-CONSTCD14 days    operator-(const weekday& x, const weekday& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday& wd);
-
-// weekday_indexed
-
-class weekday_indexed
-{
-    unsigned char wd_    : 4;
-    unsigned char index_ : 4;
-
-public:
-    CONSTCD11 weekday_indexed(const julian::weekday& wd, unsigned index) NOEXCEPT;
-
-    CONSTCD11 julian::weekday weekday() const NOEXCEPT;
-    CONSTCD11 unsigned index() const NOEXCEPT;
-    CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday_indexed& wdi);
-
-// weekday_last
-
-class weekday_last
-{
-    julian::weekday wd_;
-
-public:
-    explicit CONSTCD11 weekday_last(const julian::weekday& wd) NOEXCEPT;
-
-    CONSTCD11 julian::weekday weekday() const NOEXCEPT;
-    CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const weekday_last& x, const weekday_last& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const weekday_last& x, const weekday_last& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday_last& wdl);
-
-// year_month
-
-class year_month
-{
-    julian::year  y_;
-    julian::month m_;
-
-public:
-    CONSTCD11 year_month(const julian::year& y, const julian::month& m) NOEXCEPT;
-
-    CONSTCD11 julian::year  year()  const NOEXCEPT;
-    CONSTCD11 julian::month month() const NOEXCEPT;
-
-    CONSTCD14 year_month& operator+=(const months& dm) NOEXCEPT;
-    CONSTCD14 year_month& operator-=(const months& dm) NOEXCEPT;
-    CONSTCD14 year_month& operator+=(const years& dy) NOEXCEPT;
-    CONSTCD14 year_month& operator-=(const years& dy) NOEXCEPT;
-
-    CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const year_month& x, const year_month& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const year_month& x, const year_month& y) NOEXCEPT;
-CONSTCD11 bool operator< (const year_month& x, const year_month& y) NOEXCEPT;
-CONSTCD11 bool operator> (const year_month& x, const year_month& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const year_month& x, const year_month& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const year_month& x, const year_month& y) NOEXCEPT;
-
-CONSTCD14 year_month operator+(const year_month& ym, const months& dm) NOEXCEPT;
-CONSTCD14 year_month operator+(const months& dm, const year_month& ym) NOEXCEPT;
-CONSTCD14 year_month operator-(const year_month& ym, const months& dm) NOEXCEPT;
-
-CONSTCD11 months operator-(const year_month& x, const year_month& y) NOEXCEPT;
-CONSTCD11 year_month operator+(const year_month& ym, const years& dy) NOEXCEPT;
-CONSTCD11 year_month operator+(const years& dy, const year_month& ym) NOEXCEPT;
-CONSTCD11 year_month operator-(const year_month& ym, const years& dy) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month& ym);
-
-// month_day
-
-class month_day
-{
-    julian::month m_;
-    julian::day   d_;
-
-public:
-    CONSTCD11 month_day(const julian::month& m, const julian::day& d) NOEXCEPT;
-
-    CONSTCD11 julian::month month() const NOEXCEPT;
-    CONSTCD11 julian::day   day() const NOEXCEPT;
-
-    CONSTCD14 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const month_day& x, const month_day& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const month_day& x, const month_day& y) NOEXCEPT;
-CONSTCD11 bool operator< (const month_day& x, const month_day& y) NOEXCEPT;
-CONSTCD11 bool operator> (const month_day& x, const month_day& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const month_day& x, const month_day& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const month_day& x, const month_day& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_day& md);
-
-// month_day_last
-
-class month_day_last
-{
-    julian::month m_;
-
-public:
-    CONSTCD11 explicit month_day_last(const julian::month& m) NOEXCEPT;
-
-    CONSTCD11 julian::month month() const NOEXCEPT;
-    CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const month_day_last& x, const month_day_last& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const month_day_last& x, const month_day_last& y) NOEXCEPT;
-CONSTCD11 bool operator< (const month_day_last& x, const month_day_last& y) NOEXCEPT;
-CONSTCD11 bool operator> (const month_day_last& x, const month_day_last& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const month_day_last& x, const month_day_last& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const month_day_last& x, const month_day_last& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_day_last& mdl);
-
-// month_weekday
-
-class month_weekday
-{
-    julian::month           m_;
-    julian::weekday_indexed wdi_;
-public:
-    CONSTCD11 month_weekday(const julian::month& m,
-                            const julian::weekday_indexed& wdi) NOEXCEPT;
-
-    CONSTCD11 julian::month           month()           const NOEXCEPT;
-    CONSTCD11 julian::weekday_indexed weekday_indexed() const NOEXCEPT;
-
-    CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const month_weekday& x, const month_weekday& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const month_weekday& x, const month_weekday& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_weekday& mwd);
-
-// month_weekday_last
-
-class month_weekday_last
-{
-    julian::month        m_;
-    julian::weekday_last wdl_;
-
-public:
-    CONSTCD11 month_weekday_last(const julian::month& m,
-                                 const julian::weekday_last& wd) NOEXCEPT;
-
-    CONSTCD11 julian::month        month()        const NOEXCEPT;
-    CONSTCD11 julian::weekday_last weekday_last() const NOEXCEPT;
-
-    CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11
-    bool operator==(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT;
-CONSTCD11
-    bool operator!=(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_weekday_last& mwdl);
-
-// class year_month_day
-
-class year_month_day
-{
-    julian::year  y_;
-    julian::month m_;
-    julian::day   d_;
-
-public:
-    CONSTCD11 year_month_day(const julian::year& y, const julian::month& m,
-                             const julian::day& d) NOEXCEPT;
-    CONSTCD14 year_month_day(const year_month_day_last& ymdl) NOEXCEPT;
-
-    CONSTCD14 year_month_day(sys_days dp) NOEXCEPT;
-    CONSTCD14 explicit year_month_day(local_days dp) NOEXCEPT;
-
-    CONSTCD14 year_month_day& operator+=(const months& m) NOEXCEPT;
-    CONSTCD14 year_month_day& operator-=(const months& m) NOEXCEPT;
-    CONSTCD14 year_month_day& operator+=(const years& y)  NOEXCEPT;
-    CONSTCD14 year_month_day& operator-=(const years& y)  NOEXCEPT;
-
-    CONSTCD11 julian::year  year()  const NOEXCEPT;
-    CONSTCD11 julian::month month() const NOEXCEPT;
-    CONSTCD11 julian::day   day()   const NOEXCEPT;
-
-    CONSTCD14 operator sys_days() const NOEXCEPT;
-    CONSTCD14 explicit operator local_days() const NOEXCEPT;
-    CONSTCD14 bool ok() const NOEXCEPT;
-
-private:
-    static CONSTCD14 year_month_day from_days(days dp) NOEXCEPT;
-    CONSTCD14 days to_days() const NOEXCEPT;
-};
-
-CONSTCD11 bool operator==(const year_month_day& x, const year_month_day& y) NOEXCEPT;
-CONSTCD11 bool operator!=(const year_month_day& x, const year_month_day& y) NOEXCEPT;
-CONSTCD11 bool operator< (const year_month_day& x, const year_month_day& y) NOEXCEPT;
-CONSTCD11 bool operator> (const year_month_day& x, const year_month_day& y) NOEXCEPT;
-CONSTCD11 bool operator<=(const year_month_day& x, const year_month_day& y) NOEXCEPT;
-CONSTCD11 bool operator>=(const year_month_day& x, const year_month_day& y) NOEXCEPT;
-
-CONSTCD14 year_month_day operator+(const year_month_day& ymd, const months& dm) NOEXCEPT;
-CONSTCD14 year_month_day operator+(const months& dm, const year_month_day& ymd) NOEXCEPT;
-CONSTCD14 year_month_day operator-(const year_month_day& ymd, const months& dm) NOEXCEPT;
-CONSTCD11 year_month_day operator+(const year_month_day& ymd, const years& dy)  NOEXCEPT;
-CONSTCD11 year_month_day operator+(const years& dy, const year_month_day& ymd)  NOEXCEPT;
-CONSTCD11 year_month_day operator-(const year_month_day& ymd, const years& dy)  NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_day& ymd);
-
-// year_month_day_last
-
-class year_month_day_last
-{
-    julian::year           y_;
-    julian::month_day_last mdl_;
-
-public:
-    CONSTCD11 year_month_day_last(const julian::year& y,
-                                  const julian::month_day_last& mdl) NOEXCEPT;
-
-    CONSTCD14 year_month_day_last& operator+=(const months& m) NOEXCEPT;
-    CONSTCD14 year_month_day_last& operator-=(const months& m) NOEXCEPT;
-    CONSTCD14 year_month_day_last& operator+=(const years& y)  NOEXCEPT;
-    CONSTCD14 year_month_day_last& operator-=(const years& y)  NOEXCEPT;
-
-    CONSTCD11 julian::year           year()           const NOEXCEPT;
-    CONSTCD11 julian::month          month()          const NOEXCEPT;
-    CONSTCD11 julian::month_day_last month_day_last() const NOEXCEPT;
-    CONSTCD14 julian::day            day()            const NOEXCEPT;
-
-    CONSTCD14 operator sys_days() const NOEXCEPT;
-    CONSTCD14 explicit operator local_days() const NOEXCEPT;
-    CONSTCD11 bool ok() const NOEXCEPT;
-};
-
-CONSTCD11
-    bool operator==(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT;
-CONSTCD11
-    bool operator!=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT;
-CONSTCD11
-    bool operator< (const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT;
-CONSTCD11
-    bool operator> (const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT;
-CONSTCD11
-    bool operator<=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT;
-CONSTCD11
-    bool operator>=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT;
-
-CONSTCD14
-year_month_day_last
-operator+(const year_month_day_last& ymdl, const months& dm) NOEXCEPT;
-
-CONSTCD14
-year_month_day_last
-operator+(const months& dm, const year_month_day_last& ymdl) NOEXCEPT;
-
-CONSTCD11
-year_month_day_last
-operator+(const year_month_day_last& ymdl, const years& dy) NOEXCEPT;
-
-CONSTCD11
-year_month_day_last
-operator+(const years& dy, const year_month_day_last& ymdl) NOEXCEPT;
-
-CONSTCD14
-year_month_day_last
-operator-(const year_month_day_last& ymdl, const months& dm) NOEXCEPT;
-
-CONSTCD11
-year_month_day_last
-operator-(const year_month_day_last& ymdl, const years& dy) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_day_last& ymdl);
-
-// year_month_weekday
-
-class year_month_weekday
-{
-    julian::year            y_;
-    julian::month           m_;
-    julian::weekday_indexed wdi_;
-
-public:
-    CONSTCD11 year_month_weekday(const julian::year& y, const julian::month& m,
-                                   const julian::weekday_indexed& wdi) NOEXCEPT;
-    CONSTCD14 year_month_weekday(const sys_days& dp) NOEXCEPT;
-    CONSTCD14 explicit year_month_weekday(const local_days& dp) NOEXCEPT;
-
-    CONSTCD14 year_month_weekday& operator+=(const months& m) NOEXCEPT;
-    CONSTCD14 year_month_weekday& operator-=(const months& m) NOEXCEPT;
-    CONSTCD14 year_month_weekday& operator+=(const years& y)  NOEXCEPT;
-    CONSTCD14 year_month_weekday& operator-=(const years& y)  NOEXCEPT;
-
-    CONSTCD11 julian::year year() const NOEXCEPT;
-    CONSTCD11 julian::month month() const NOEXCEPT;
-    CONSTCD11 julian::weekday weekday() const NOEXCEPT;
-    CONSTCD11 unsigned index() const NOEXCEPT;
-    CONSTCD11 julian::weekday_indexed weekday_indexed() const NOEXCEPT;
-
-    CONSTCD14 operator sys_days() const NOEXCEPT;
-    CONSTCD14 explicit operator local_days() const NOEXCEPT;
-    CONSTCD14 bool ok() const NOEXCEPT;
-
-private:
-    static CONSTCD14 year_month_weekday from_days(days dp) NOEXCEPT;
-    CONSTCD14 days to_days() const NOEXCEPT;
-};
-
-CONSTCD11
-    bool operator==(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT;
-CONSTCD11
-    bool operator!=(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT;
-
-CONSTCD14
-year_month_weekday
-operator+(const year_month_weekday& ymwd, const months& dm) NOEXCEPT;
-
-CONSTCD14
-year_month_weekday
-operator+(const months& dm, const year_month_weekday& ymwd) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator+(const year_month_weekday& ymwd, const years& dy) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator+(const years& dy, const year_month_weekday& ymwd) NOEXCEPT;
-
-CONSTCD14
-year_month_weekday
-operator-(const year_month_weekday& ymwd, const months& dm) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday
-operator-(const year_month_weekday& ymwd, const years& dy) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_weekday& ymwdi);
-
-// year_month_weekday_last
-
-class year_month_weekday_last
-{
-    julian::year y_;
-    julian::month m_;
-    julian::weekday_last wdl_;
-
-public:
-    CONSTCD11 year_month_weekday_last(const julian::year& y, const julian::month& m,
-                                      const julian::weekday_last& wdl) NOEXCEPT;
-
-    CONSTCD14 year_month_weekday_last& operator+=(const months& m) NOEXCEPT;
-    CONSTCD14 year_month_weekday_last& operator-=(const months& m) NOEXCEPT;
-    CONSTCD14 year_month_weekday_last& operator+=(const years& y) NOEXCEPT;
-    CONSTCD14 year_month_weekday_last& operator-=(const years& y) NOEXCEPT;
-
-    CONSTCD11 julian::year year() const NOEXCEPT;
-    CONSTCD11 julian::month month() const NOEXCEPT;
-    CONSTCD11 julian::weekday weekday() const NOEXCEPT;
-    CONSTCD11 julian::weekday_last weekday_last() const NOEXCEPT;
-
-    CONSTCD14 operator sys_days() const NOEXCEPT;
-    CONSTCD14 explicit operator local_days() const NOEXCEPT;
-    CONSTCD11 bool ok() const NOEXCEPT;
-
-private:
-    CONSTCD14 days to_days() const NOEXCEPT;
-};
-
-CONSTCD11
-bool
-operator==(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT;
-
-CONSTCD11
-bool
-operator!=(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT;
-
-CONSTCD14
-year_month_weekday_last
-operator+(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT;
-
-CONSTCD14
-year_month_weekday_last
-operator+(const months& dm, const year_month_weekday_last& ymwdl) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator+(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator+(const years& dy, const year_month_weekday_last& ymwdl) NOEXCEPT;
-
-CONSTCD14
-year_month_weekday_last
-operator-(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT;
-
-CONSTCD11
-year_month_weekday_last
-operator-(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT;
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_weekday_last& ymwdl);
-
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
-inline namespace literals
-{
-
-CONSTCD11 julian::day  operator "" _d(unsigned long long d) NOEXCEPT;
-CONSTCD11 julian::year operator "" _y(unsigned long long y) NOEXCEPT;
-
-// CONSTDATA julian::month jan{1};
-// CONSTDATA julian::month feb{2};
-// CONSTDATA julian::month mar{3};
-// CONSTDATA julian::month apr{4};
-// CONSTDATA julian::month may{5};
-// CONSTDATA julian::month jun{6};
-// CONSTDATA julian::month jul{7};
-// CONSTDATA julian::month aug{8};
-// CONSTDATA julian::month sep{9};
-// CONSTDATA julian::month oct{10};
-// CONSTDATA julian::month nov{11};
-// CONSTDATA julian::month dec{12};
-
-}  // inline namespace literals
-#endif // !defined(_MSC_VER) || (_MSC_VER >= 1900)
-
-//----------------+
-// Implementation |
-//----------------+
-
-// day
-
-CONSTCD11 inline day::day(unsigned d) NOEXCEPT : d_(static_cast<unsigned char>(d)) {}
-CONSTCD14 inline day& day::operator++() NOEXCEPT {++d_; return *this;}
-CONSTCD14 inline day day::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;}
-CONSTCD14 inline day& day::operator--() NOEXCEPT {--d_; return *this;}
-CONSTCD14 inline day day::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;}
-CONSTCD14 inline day& day::operator+=(const days& d) NOEXCEPT {*this = *this + d; return *this;}
-CONSTCD14 inline day& day::operator-=(const days& d) NOEXCEPT {*this = *this - d; return *this;}
-CONSTCD11 inline day::operator unsigned() const NOEXCEPT {return d_;}
-CONSTCD11 inline bool day::ok() const NOEXCEPT {return 1 <= d_ && d_ <= 31;}
-
-CONSTCD11
-inline
-bool
-operator==(const day& x, const day& y) NOEXCEPT
-{
-    return static_cast<unsigned>(x) == static_cast<unsigned>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const day& x, const day& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const day& x, const day& y) NOEXCEPT
-{
-    return static_cast<unsigned>(x) < static_cast<unsigned>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator>(const day& x, const day& y) NOEXCEPT
-{
-    return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const day& x, const day& y) NOEXCEPT
-{
-    return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const day& x, const day& y) NOEXCEPT
-{
-    return !(x < y);
-}
-
-CONSTCD11
-inline
-days
-operator-(const day& x, const day& y) NOEXCEPT
-{
-    return days{static_cast<days::rep>(static_cast<unsigned>(x)
-                                     - static_cast<unsigned>(y))};
-}
-
-CONSTCD11
-inline
-day
-operator+(const day& x, const days& y) NOEXCEPT
-{
-    return day{static_cast<unsigned>(x) + static_cast<unsigned>(y.count())};
-}
-
-CONSTCD11
-inline
-day
-operator+(const days& x, const day& y) NOEXCEPT
-{
-    return y + x;
-}
-
-CONSTCD11
-inline
-day
-operator-(const day& x, const days& y) NOEXCEPT
-{
-    return x + -y;
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const day& d)
-{
-    date::detail::save_ostream<CharT, Traits> _(os);
-    os.fill('0');
-    os.flags(std::ios::dec | std::ios::right);
-    os.width(2);
-    os << static_cast<unsigned>(d);
-    return os;
-}
-
-// month
-
-CONSTCD11 inline month::month(unsigned m) NOEXCEPT : m_(static_cast<decltype(m_)>(m)) {}
-CONSTCD14 inline month& month::operator++() NOEXCEPT {if (++m_ == 13) m_ = 1; return *this;}
-CONSTCD14 inline month month::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;}
-CONSTCD14 inline month& month::operator--() NOEXCEPT {if (--m_ == 0) m_ = 12; return *this;}
-CONSTCD14 inline month month::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;}
-
-CONSTCD14
-inline
-month&
-month::operator+=(const months& m) NOEXCEPT
-{
-    *this = *this + m;
-    return *this;
-}
-
-CONSTCD14
-inline
-month&
-month::operator-=(const months& m) NOEXCEPT
-{
-    *this = *this - m;
-    return *this;
-}
-
-CONSTCD11 inline month::operator unsigned() const NOEXCEPT {return m_;}
-CONSTCD11 inline bool month::ok() const NOEXCEPT {return 1 <= m_ && m_ <= 12;}
-
-CONSTCD11
-inline
-bool
-operator==(const month& x, const month& y) NOEXCEPT
-{
-    return static_cast<unsigned>(x) == static_cast<unsigned>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const month& x, const month& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const month& x, const month& y) NOEXCEPT
-{
-    return static_cast<unsigned>(x) < static_cast<unsigned>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator>(const month& x, const month& y) NOEXCEPT
-{
-    return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const month& x, const month& y) NOEXCEPT
-{
-    return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const month& x, const month& y) NOEXCEPT
-{
-    return !(x < y);
-}
-
-CONSTCD14
-inline
-months
-operator-(const month& x, const month& y) NOEXCEPT
-{
-    auto const d = static_cast<unsigned>(x) - static_cast<unsigned>(y);
-    return months(d <= 11 ? d : d + 12);
-}
-
-CONSTCD14
-inline
-month
-operator+(const month& x, const months& y) NOEXCEPT
-{
-    auto const mu = static_cast<long long>(static_cast<unsigned>(x)) - 1 + y.count();
-    auto const yr = (mu >= 0 ? mu : mu-11) / 12;
-    return month{static_cast<unsigned>(mu - yr * 12 + 1)};
-}
-
-CONSTCD14
-inline
-month
-operator+(const months& x, const month& y) NOEXCEPT
-{
-    return y + x;
-}
-
-CONSTCD14
-inline
-month
-operator-(const month& x, const months& y) NOEXCEPT
-{
-    return x + -y;
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month& m)
-{
-    switch (static_cast<unsigned>(m))
-    {
-    case 1:
-        os << "Jan";
-        break;
-    case 2:
-        os << "Feb";
-        break;
-    case 3:
-        os << "Mar";
-        break;
-    case 4:
-        os << "Apr";
-        break;
-    case 5:
-        os << "May";
-        break;
-    case 6:
-        os << "Jun";
-        break;
-    case 7:
-        os << "Jul";
-        break;
-    case 8:
-        os << "Aug";
-        break;
-    case 9:
-        os << "Sep";
-        break;
-    case 10:
-        os << "Oct";
-        break;
-    case 11:
-        os << "Nov";
-        break;
-    case 12:
-        os << "Dec";
-        break;
-    default:
-        os << static_cast<unsigned>(m) << " is not a valid month";
-        break;
-    }
-    return os;
-}
-
-// year
-
-CONSTCD11 inline year::year(int y) NOEXCEPT : y_(static_cast<decltype(y_)>(y)) {}
-CONSTCD14 inline year& year::operator++() NOEXCEPT {++y_; return *this;}
-CONSTCD14 inline year year::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;}
-CONSTCD14 inline year& year::operator--() NOEXCEPT {--y_; return *this;}
-CONSTCD14 inline year year::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;}
-CONSTCD14 inline year& year::operator+=(const years& y) NOEXCEPT {*this = *this + y; return *this;}
-CONSTCD14 inline year& year::operator-=(const years& y) NOEXCEPT {*this = *this - y; return *this;}
-
-CONSTCD11
-inline
-bool
-year::is_leap() const NOEXCEPT
-{
-    return y_ % 4 == 0;
-}
-
-CONSTCD11 inline year::operator int() const NOEXCEPT {return y_;}
-CONSTCD11 inline bool year::ok() const NOEXCEPT {return true;}
-
-CONSTCD11
-inline
-year
-year::min() NOEXCEPT
-{
-    return year{std::numeric_limits<short>::min()};
-}
-
-CONSTCD11
-inline
-year
-year::max() NOEXCEPT
-{
-    return year{std::numeric_limits<short>::max()};
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year& x, const year& y) NOEXCEPT
-{
-    return static_cast<int>(x) == static_cast<int>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year& x, const year& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const year& x, const year& y) NOEXCEPT
-{
-    return static_cast<int>(x) < static_cast<int>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator>(const year& x, const year& y) NOEXCEPT
-{
-    return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const year& x, const year& y) NOEXCEPT
-{
-    return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const year& x, const year& y) NOEXCEPT
-{
-    return !(x < y);
-}
-
-CONSTCD11
-inline
-years
-operator-(const year& x, const year& y) NOEXCEPT
-{
-    return years{static_cast<int>(x) - static_cast<int>(y)};
-}
-
-CONSTCD11
-inline
-year
-operator+(const year& x, const years& y) NOEXCEPT
-{
-    return year{static_cast<int>(x) + y.count()};
-}
-
-CONSTCD11
-inline
-year
-operator+(const years& x, const year& y) NOEXCEPT
-{
-    return y + x;
-}
-
-CONSTCD11
-inline
-year
-operator-(const year& x, const years& y) NOEXCEPT
-{
-    return year{static_cast<int>(x) - y.count()};
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year& y)
-{
-    date::detail::save_ostream<CharT, Traits> _(os);
-    os.fill('0');
-    os.flags(std::ios::dec | std::ios::internal);
-    os.width(4 + (y < year{0}));
-    os << static_cast<int>(y);
-    return os;
-}
-
-// weekday
-
-CONSTCD11
-inline
-unsigned char
-weekday::weekday_from_days(int z) NOEXCEPT
-{
-    return static_cast<unsigned char>(static_cast<unsigned>(
-        z >= -4 ? (z+4) % 7 : (z+5) % 7 + 6));
-}
-
-CONSTCD11
-inline
-weekday::weekday(unsigned wd) NOEXCEPT
-    : wd_(static_cast<decltype(wd_)>(wd))
-    {}
-
-CONSTCD11
-inline
-weekday::weekday(const sys_days& dp) NOEXCEPT
-    : wd_(weekday_from_days(dp.time_since_epoch().count()))
-    {}
-
-CONSTCD11
-inline
-weekday::weekday(const local_days& dp) NOEXCEPT
-    : wd_(weekday_from_days(dp.time_since_epoch().count()))
-    {}
-
-CONSTCD14 inline weekday& weekday::operator++() NOEXCEPT {if (++wd_ == 7) wd_ = 0; return *this;}
-CONSTCD14 inline weekday weekday::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;}
-CONSTCD14 inline weekday& weekday::operator--() NOEXCEPT {if (wd_-- == 0) wd_ = 6; return *this;}
-CONSTCD14 inline weekday weekday::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;}
-
-CONSTCD14
-inline
-weekday&
-weekday::operator+=(const days& d) NOEXCEPT
-{
-    *this = *this + d;
-    return *this;
-}
-
-CONSTCD14
-inline
-weekday&
-weekday::operator-=(const days& d) NOEXCEPT
-{
-    *this = *this - d;
-    return *this;
-}
-
-CONSTCD11
-inline
-weekday::operator unsigned() const NOEXCEPT
-{
-    return static_cast<unsigned>(wd_);
-}
-
-CONSTCD11 inline bool weekday::ok() const NOEXCEPT {return wd_ <= 6;}
-
-CONSTCD11
-inline
-bool
-operator==(const weekday& x, const weekday& y) NOEXCEPT
-{
-    return static_cast<unsigned>(x) == static_cast<unsigned>(y);
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const weekday& x, const weekday& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-CONSTCD14
-inline
-days
-operator-(const weekday& x, const weekday& y) NOEXCEPT
-{
-    auto const diff = static_cast<unsigned>(x) - static_cast<unsigned>(y);
-    return days{diff <= 6 ? diff : diff + 7};
-}
-
-CONSTCD14
-inline
-weekday
-operator+(const weekday& x, const days& y) NOEXCEPT
-{
-    auto const wdu = static_cast<long long>(static_cast<unsigned>(x)) + y.count();
-    auto const wk = (wdu >= 0 ? wdu : wdu-6) / 7;
-    return weekday{static_cast<unsigned>(wdu - wk * 7)};
-}
-
-CONSTCD14
-inline
-weekday
-operator+(const days& x, const weekday& y) NOEXCEPT
-{
-    return y + x;
-}
-
-CONSTCD14
-inline
-weekday
-operator-(const weekday& x, const days& y) NOEXCEPT
-{
-    return x + -y;
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday& wd)
-{
-    switch (static_cast<unsigned>(wd))
-    {
-    case 0:
-        os << "Sun";
-        break;
-    case 1:
-        os << "Mon";
-        break;
-    case 2:
-        os << "Tue";
-        break;
-    case 3:
-        os << "Wed";
-        break;
-    case 4:
-        os << "Thu";
-        break;
-    case 5:
-        os << "Fri";
-        break;
-    case 6:
-        os << "Sat";
-        break;
-    default:
-        os << static_cast<unsigned>(wd) << " is not a valid weekday";
-        break;
-    }
-    return os;
-}
-
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
-inline namespace literals
-{
-
-CONSTCD11
-inline
-julian::day
-operator "" _d(unsigned long long d) NOEXCEPT
-{
-    return julian::day{static_cast<unsigned>(d)};
-}
-
-CONSTCD11
-inline
-julian::year
-operator "" _y(unsigned long long y) NOEXCEPT
-{
-    return julian::year(static_cast<int>(y));
-}
-#endif  // !defined(_MSC_VER) || (_MSC_VER >= 1900)
-
-CONSTDATA julian::last_spec last{};
-
-CONSTDATA julian::month jan{1};
-CONSTDATA julian::month feb{2};
-CONSTDATA julian::month mar{3};
-CONSTDATA julian::month apr{4};
-CONSTDATA julian::month may{5};
-CONSTDATA julian::month jun{6};
-CONSTDATA julian::month jul{7};
-CONSTDATA julian::month aug{8};
-CONSTDATA julian::month sep{9};
-CONSTDATA julian::month oct{10};
-CONSTDATA julian::month nov{11};
-CONSTDATA julian::month dec{12};
-
-CONSTDATA julian::weekday sun{0u};
-CONSTDATA julian::weekday mon{1u};
-CONSTDATA julian::weekday tue{2u};
-CONSTDATA julian::weekday wed{3u};
-CONSTDATA julian::weekday thu{4u};
-CONSTDATA julian::weekday fri{5u};
-CONSTDATA julian::weekday sat{6u};
-
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
-}  // inline namespace literals
-#endif
-
-// weekday_indexed
-
-CONSTCD11
-inline
-weekday
-weekday_indexed::weekday() const NOEXCEPT
-{
-    return julian::weekday{static_cast<unsigned>(wd_)};
-}
-
-CONSTCD11 inline unsigned weekday_indexed::index() const NOEXCEPT {return index_;}
-
-CONSTCD11
-inline
-bool
-weekday_indexed::ok() const NOEXCEPT
-{
-    return weekday().ok() && 1 <= index_ && index_ <= 5;
-}
-
-CONSTCD11
-inline
-weekday_indexed::weekday_indexed(const julian::weekday& wd, unsigned index) NOEXCEPT
-    : wd_(static_cast<decltype(wd_)>(static_cast<unsigned>(wd)))
-    , index_(static_cast<decltype(index_)>(index))
-    {}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday_indexed& wdi)
-{
-    return os << wdi.weekday() << '[' << wdi.index() << ']';
-}
-
-CONSTCD11
-inline
-weekday_indexed
-weekday::operator[](unsigned index) const NOEXCEPT
-{
-    return {*this, index};
-}
-
-CONSTCD11
-inline
-bool
-operator==(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT
-{
-    return x.weekday() == y.weekday() && x.index() == y.index();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-// weekday_last
-
-CONSTCD11 inline julian::weekday weekday_last::weekday() const NOEXCEPT {return wd_;}
-CONSTCD11 inline bool weekday_last::ok() const NOEXCEPT {return wd_.ok();}
-CONSTCD11 inline weekday_last::weekday_last(const julian::weekday& wd) NOEXCEPT : wd_(wd) {}
-
-CONSTCD11
-inline
-bool
-operator==(const weekday_last& x, const weekday_last& y) NOEXCEPT
-{
-    return x.weekday() == y.weekday();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const weekday_last& x, const weekday_last& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const weekday_last& wdl)
-{
-    return os << wdl.weekday() << "[last]";
-}
-
-CONSTCD11
-inline
-weekday_last
-weekday::operator[](last_spec) const NOEXCEPT
-{
-    return weekday_last{*this};
-}
-
-// year_month
-
-CONSTCD11
-inline
-year_month::year_month(const julian::year& y, const julian::month& m) NOEXCEPT
-    : y_(y)
-    , m_(m)
-    {}
-
-CONSTCD11 inline year year_month::year() const NOEXCEPT {return y_;}
-CONSTCD11 inline month year_month::month() const NOEXCEPT {return m_;}
-CONSTCD11 inline bool year_month::ok() const NOEXCEPT {return y_.ok() && m_.ok();}
-
-CONSTCD14
-inline
-year_month&
-year_month::operator+=(const months& dm) NOEXCEPT
-{
-    *this = *this + dm;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month&
-year_month::operator-=(const months& dm) NOEXCEPT
-{
-    *this = *this - dm;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month&
-year_month::operator+=(const years& dy) NOEXCEPT
-{
-    *this = *this + dy;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month&
-year_month::operator-=(const years& dy) NOEXCEPT
-{
-    *this = *this - dy;
-    return *this;
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year_month& x, const year_month& y) NOEXCEPT
-{
-    return x.year() == y.year() && x.month() == y.month();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year_month& x, const year_month& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const year_month& x, const year_month& y) NOEXCEPT
-{
-    return x.year() < y.year() ? true
-        : (x.year() > y.year() ? false
-        : (x.month() < y.month()));
-}
-
-CONSTCD11
-inline
-bool
-operator>(const year_month& x, const year_month& y) NOEXCEPT
-{
-    return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const year_month& x, const year_month& y) NOEXCEPT
-{
-    return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const year_month& x, const year_month& y) NOEXCEPT
-{
-    return !(x < y);
-}
-
-CONSTCD14
-inline
-year_month
-operator+(const year_month& ym, const months& dm) NOEXCEPT
-{
-    auto dmi = static_cast<int>(static_cast<unsigned>(ym.month())) - 1 + dm.count();
-    auto dy = (dmi >= 0 ? dmi : dmi-11) / 12;
-    dmi = dmi - dy * 12 + 1;
-    return (ym.year() + years(dy)) / month(static_cast<unsigned>(dmi));
-}
-
-CONSTCD14
-inline
-year_month
-operator+(const months& dm, const year_month& ym) NOEXCEPT
-{
-    return ym + dm;
-}
-
-CONSTCD14
-inline
-year_month
-operator-(const year_month& ym, const months& dm) NOEXCEPT
-{
-    return ym + -dm;
-}
-
-CONSTCD11
-inline
-months
-operator-(const year_month& x, const year_month& y) NOEXCEPT
-{
-    return (x.year() - y.year()) +
-            months(static_cast<unsigned>(x.month()) - static_cast<unsigned>(y.month()));
-}
-
-CONSTCD11
-inline
-year_month
-operator+(const year_month& ym, const years& dy) NOEXCEPT
-{
-    return (ym.year() + dy) / ym.month();
-}
-
-CONSTCD11
-inline
-year_month
-operator+(const years& dy, const year_month& ym) NOEXCEPT
-{
-    return ym + dy;
-}
-
-CONSTCD11
-inline
-year_month
-operator-(const year_month& ym, const years& dy) NOEXCEPT
-{
-    return ym + -dy;
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month& ym)
-{
-    return os << ym.year() << '/' << ym.month();
-}
-
-// month_day
-
-CONSTCD11
-inline
-month_day::month_day(const julian::month& m, const julian::day& d) NOEXCEPT
-    : m_(m)
-    , d_(d)
-    {}
-
-CONSTCD11 inline julian::month month_day::month() const NOEXCEPT {return m_;}
-CONSTCD11 inline julian::day month_day::day() const NOEXCEPT {return d_;}
-
-CONSTCD14
-inline
-bool
-month_day::ok() const NOEXCEPT
-{
-    CONSTDATA julian::day d[] =
-        {31_d, 29_d, 31_d, 30_d, 31_d, 30_d, 31_d, 31_d, 30_d, 31_d, 30_d, 31_d};
-    return m_.ok() && 1_d <= d_ && d_ <= d[static_cast<unsigned>(m_)-1];
-}
-
-CONSTCD11
-inline
-bool
-operator==(const month_day& x, const month_day& y) NOEXCEPT
-{
-    return x.month() == y.month() && x.day() == y.day();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const month_day& x, const month_day& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const month_day& x, const month_day& y) NOEXCEPT
-{
-    return x.month() < y.month() ? true
-        : (x.month() > y.month() ? false
-        : (x.day() < y.day()));
-}
-
-CONSTCD11
-inline
-bool
-operator>(const month_day& x, const month_day& y) NOEXCEPT
-{
-    return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const month_day& x, const month_day& y) NOEXCEPT
-{
-    return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const month_day& x, const month_day& y) NOEXCEPT
-{
-    return !(x < y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_day& md)
-{
-    return os << md.month() << '/' << md.day();
-}
-
-// month_day_last
-
-CONSTCD11 inline month month_day_last::month() const NOEXCEPT {return m_;}
-CONSTCD11 inline bool month_day_last::ok() const NOEXCEPT {return m_.ok();}
-CONSTCD11 inline month_day_last::month_day_last(const julian::month& m) NOEXCEPT : m_(m) {}
-
-CONSTCD11
-inline
-bool
-operator==(const month_day_last& x, const month_day_last& y) NOEXCEPT
-{
-    return x.month() == y.month();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const month_day_last& x, const month_day_last& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const month_day_last& x, const month_day_last& y) NOEXCEPT
-{
-    return x.month() < y.month();
-}
-
-CONSTCD11
-inline
-bool
-operator>(const month_day_last& x, const month_day_last& y) NOEXCEPT
-{
-    return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const month_day_last& x, const month_day_last& y) NOEXCEPT
-{
-    return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const month_day_last& x, const month_day_last& y) NOEXCEPT
-{
-    return !(x < y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_day_last& mdl)
-{
-    return os << mdl.month() << "/last";
-}
-
-// month_weekday
-
-CONSTCD11
-inline
-month_weekday::month_weekday(const julian::month& m,
-                             const julian::weekday_indexed& wdi) NOEXCEPT
-    : m_(m)
-    , wdi_(wdi)
-    {}
-
-CONSTCD11 inline month month_weekday::month() const NOEXCEPT {return m_;}
-
-CONSTCD11
-inline
-weekday_indexed
-month_weekday::weekday_indexed() const NOEXCEPT
-{
-    return wdi_;
-}
-
-CONSTCD11
-inline
-bool
-month_weekday::ok() const NOEXCEPT
-{
-    return m_.ok() && wdi_.ok();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const month_weekday& x, const month_weekday& y) NOEXCEPT
-{
-    return x.month() == y.month() && x.weekday_indexed() == y.weekday_indexed();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const month_weekday& x, const month_weekday& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_weekday& mwd)
-{
-    return os << mwd.month() << '/' << mwd.weekday_indexed();
-}
-
-// month_weekday_last
-
-CONSTCD11
-inline
-month_weekday_last::month_weekday_last(const julian::month& m,
-                                       const julian::weekday_last& wdl) NOEXCEPT
-    : m_(m)
-    , wdl_(wdl)
-    {}
-
-CONSTCD11 inline month month_weekday_last::month() const NOEXCEPT {return m_;}
-
-CONSTCD11
-inline
-weekday_last
-month_weekday_last::weekday_last() const NOEXCEPT
-{
-    return wdl_;
-}
-
-CONSTCD11
-inline
-bool
-month_weekday_last::ok() const NOEXCEPT
-{
-    return m_.ok() && wdl_.ok();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT
-{
-    return x.month() == y.month() && x.weekday_last() == y.weekday_last();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const month_weekday_last& mwdl)
-{
-    return os << mwdl.month() << '/' << mwdl.weekday_last();
-}
-
-// year_month_day_last
-
-CONSTCD11
-inline
-year_month_day_last::year_month_day_last(const julian::year& y,
-                                         const julian::month_day_last& mdl) NOEXCEPT
-    : y_(y)
-    , mdl_(mdl)
-    {}
-
-CONSTCD14
-inline
-year_month_day_last&
-year_month_day_last::operator+=(const months& m) NOEXCEPT
-{
-    *this = *this + m;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month_day_last&
-year_month_day_last::operator-=(const months& m) NOEXCEPT
-{
-    *this = *this - m;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month_day_last&
-year_month_day_last::operator+=(const years& y) NOEXCEPT
-{
-    *this = *this + y;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month_day_last&
-year_month_day_last::operator-=(const years& y) NOEXCEPT
-{
-    *this = *this - y;
-    return *this;
-}
-
-CONSTCD11 inline year year_month_day_last::year() const NOEXCEPT {return y_;}
-CONSTCD11 inline month year_month_day_last::month() const NOEXCEPT {return mdl_.month();}
-
-CONSTCD11
-inline
-month_day_last
-year_month_day_last::month_day_last() const NOEXCEPT
-{
-    return mdl_;
-}
-
-CONSTCD14
-inline
-day
-year_month_day_last::day() const NOEXCEPT
-{
-    CONSTDATA julian::day d[] =
-        {31_d, 28_d, 31_d, 30_d, 31_d, 30_d, 31_d, 31_d, 30_d, 31_d, 30_d, 31_d};
-    return month() != feb || !y_.is_leap() ? d[static_cast<unsigned>(month())-1] : 29_d;
-}
-
-CONSTCD14
-inline
-year_month_day_last::operator sys_days() const NOEXCEPT
-{
-    return sys_days(year()/month()/day());
-}
-
-CONSTCD14
-inline
-year_month_day_last::operator local_days() const NOEXCEPT
-{
-    return local_days(year()/month()/day());
-}
-
-CONSTCD11
-inline
-bool
-year_month_day_last::ok() const NOEXCEPT
-{
-    return y_.ok() && mdl_.ok();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT
-{
-    return x.year() == y.year() && x.month_day_last() == y.month_day_last();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT
-{
-    return x.year() < y.year() ? true
-        : (x.year() > y.year() ? false
-        : (x.month_day_last() < y.month_day_last()));
-}
-
-CONSTCD11
-inline
-bool
-operator>(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT
-{
-    return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT
-{
-    return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT
-{
-    return !(x < y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_day_last& ymdl)
-{
-    return os << ymdl.year() << '/' << ymdl.month_day_last();
-}
-
-CONSTCD14
-inline
-year_month_day_last
-operator+(const year_month_day_last& ymdl, const months& dm) NOEXCEPT
-{
-    return (ymdl.year() / ymdl.month() + dm) / last;
-}
-
-CONSTCD14
-inline
-year_month_day_last
-operator+(const months& dm, const year_month_day_last& ymdl) NOEXCEPT
-{
-    return ymdl + dm;
-}
-
-CONSTCD14
-inline
-year_month_day_last
-operator-(const year_month_day_last& ymdl, const months& dm) NOEXCEPT
-{
-    return ymdl + (-dm);
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator+(const year_month_day_last& ymdl, const years& dy) NOEXCEPT
-{
-    return {ymdl.year()+dy, ymdl.month_day_last()};
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator+(const years& dy, const year_month_day_last& ymdl) NOEXCEPT
-{
-    return ymdl + dy;
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator-(const year_month_day_last& ymdl, const years& dy) NOEXCEPT
-{
-    return ymdl + (-dy);
-}
-
-// year_month_day
-
-CONSTCD11
-inline
-year_month_day::year_month_day(const julian::year& y, const julian::month& m,
-                               const julian::day& d) NOEXCEPT
-    : y_(y)
-    , m_(m)
-    , d_(d)
-    {}
-
-CONSTCD14
-inline
-year_month_day::year_month_day(const year_month_day_last& ymdl) NOEXCEPT
-    : y_(ymdl.year())
-    , m_(ymdl.month())
-    , d_(ymdl.day())
-    {}
-
-CONSTCD14
-inline
-year_month_day::year_month_day(sys_days dp) NOEXCEPT
-    : year_month_day(from_days(dp.time_since_epoch()))
-    {}
-
-CONSTCD14
-inline
-year_month_day::year_month_day(local_days dp) NOEXCEPT
-    : year_month_day(from_days(dp.time_since_epoch()))
-    {}
-
-CONSTCD11 inline year year_month_day::year() const NOEXCEPT {return y_;}
-CONSTCD11 inline month year_month_day::month() const NOEXCEPT {return m_;}
-CONSTCD11 inline day year_month_day::day() const NOEXCEPT {return d_;}
-
-CONSTCD14
-inline
-year_month_day&
-year_month_day::operator+=(const months& m) NOEXCEPT
-{
-    *this = *this + m;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month_day&
-year_month_day::operator-=(const months& m) NOEXCEPT
-{
-    *this = *this - m;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month_day&
-year_month_day::operator+=(const years& y) NOEXCEPT
-{
-    *this = *this + y;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month_day&
-year_month_day::operator-=(const years& y) NOEXCEPT
-{
-    *this = *this - y;
-    return *this;
-}
-
-CONSTCD14
-inline
-days
-year_month_day::to_days() const NOEXCEPT
-{
-    static_assert(std::numeric_limits<unsigned>::digits >= 18,
-             "This algorithm has not been ported to a 16 bit unsigned integer");
-    static_assert(std::numeric_limits<int>::digits >= 20,
-             "This algorithm has not been ported to a 16 bit signed integer");
-    auto const y = static_cast<int>(y_) - (m_ <= feb);
-    auto const m = static_cast<unsigned>(m_);
-    auto const d = static_cast<unsigned>(d_);
-    auto const era = (y >= 0 ? y : y-3) / 4;
-    auto const yoe = static_cast<unsigned>(y - era * 4);       // [0, 3]
-    auto const doy = (153*(m > 2 ? m-3 : m+9) + 2)/5 + d-1;    // [0, 365]
-    auto const doe = yoe * 365 + doy;                          // [0, 1460]
-    return days{era * 1461 + static_cast<int>(doe) - 719470};
-}
-
-CONSTCD14
-inline
-year_month_day::operator sys_days() const NOEXCEPT
-{
-    return sys_days{to_days()};
-}
-
-CONSTCD14
-inline
-year_month_day::operator local_days() const NOEXCEPT
-{
-    return local_days{to_days()};
-}
-
-CONSTCD14
-inline
-bool
-year_month_day::ok() const NOEXCEPT
-{
-    if (!(y_.ok() && m_.ok()))
-        return false;
-    return 1_d <= d_ && d_ <= (y_/m_/last).day();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year_month_day& x, const year_month_day& y) NOEXCEPT
-{
-    return x.year() == y.year() && x.month() == y.month() && x.day() == y.day();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year_month_day& x, const year_month_day& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-CONSTCD11
-inline
-bool
-operator<(const year_month_day& x, const year_month_day& y) NOEXCEPT
-{
-    return x.year() < y.year() ? true
-        : (x.year() > y.year() ? false
-        : (x.month() < y.month() ? true
-        : (x.month() > y.month() ? false
-        : (x.day() < y.day()))));
-}
-
-CONSTCD11
-inline
-bool
-operator>(const year_month_day& x, const year_month_day& y) NOEXCEPT
-{
-    return y < x;
-}
-
-CONSTCD11
-inline
-bool
-operator<=(const year_month_day& x, const year_month_day& y) NOEXCEPT
-{
-    return !(y < x);
-}
-
-CONSTCD11
-inline
-bool
-operator>=(const year_month_day& x, const year_month_day& y) NOEXCEPT
-{
-    return !(x < y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_day& ymd)
-{
-    date::detail::save_ostream<CharT, Traits> _(os);
-    os.fill('0');
-    os.flags(std::ios::dec | std::ios::right);
-    os << ymd.year() << '-';
-    os.width(2);
-    os << static_cast<unsigned>(ymd.month()) << '-';
-    os << ymd.day();
-    return os;
-}
-
-CONSTCD14
-inline
-year_month_day
-year_month_day::from_days(days dp) NOEXCEPT
-{
-    static_assert(std::numeric_limits<unsigned>::digits >= 18,
-             "This algorithm has not been ported to a 16 bit unsigned integer");
-    static_assert(std::numeric_limits<int>::digits >= 20,
-             "This algorithm has not been ported to a 16 bit signed integer");
-    auto const z = dp.count() + 719470;
-    auto const era = (z >= 0 ? z : z - 1460) / 1461;
-    auto const doe = static_cast<unsigned>(z - era * 1461);          // [0, 1460]
-    auto const yoe = (doe - doe/1460) / 365;                         // [0, 3]
-    auto const y = static_cast<sys_days::rep>(yoe) + era * 4;
-    auto const doy = doe - 365*yoe;                                  // [0, 365]
-    auto const mp = (5*doy + 2)/153;                                 // [0, 11]
-    auto const d = doy - (153*mp+2)/5 + 1;                           // [1, 31]
-    auto const m = mp < 10 ? mp+3 : mp-9;                            // [1, 12]
-    return year_month_day{julian::year{y + (m <= 2)}, julian::month(m), julian::day(d)};
-}
-
-CONSTCD14
-inline
-year_month_day
-operator+(const year_month_day& ymd, const months& dm) NOEXCEPT
-{
-    return (ymd.year() / ymd.month() + dm) / ymd.day();
-}
-
-CONSTCD14
-inline
-year_month_day
-operator+(const months& dm, const year_month_day& ymd) NOEXCEPT
-{
-    return ymd + dm;
-}
-
-CONSTCD14
-inline
-year_month_day
-operator-(const year_month_day& ymd, const months& dm) NOEXCEPT
-{
-    return ymd + (-dm);
-}
-
-CONSTCD11
-inline
-year_month_day
-operator+(const year_month_day& ymd, const years& dy) NOEXCEPT
-{
-    return (ymd.year() + dy) / ymd.month() / ymd.day();
-}
-
-CONSTCD11
-inline
-year_month_day
-operator+(const years& dy, const year_month_day& ymd) NOEXCEPT
-{
-    return ymd + dy;
-}
-
-CONSTCD11
-inline
-year_month_day
-operator-(const year_month_day& ymd, const years& dy) NOEXCEPT
-{
-    return ymd + (-dy);
-}
-
-// year_month_weekday
-
-CONSTCD11
-inline
-year_month_weekday::year_month_weekday(const julian::year& y, const julian::month& m,
-                                       const julian::weekday_indexed& wdi)
-        NOEXCEPT
-    : y_(y)
-    , m_(m)
-    , wdi_(wdi)
-    {}
-
-CONSTCD14
-inline
-year_month_weekday::year_month_weekday(const sys_days& dp) NOEXCEPT
-    : year_month_weekday(from_days(dp.time_since_epoch()))
-    {}
-
-CONSTCD14
-inline
-year_month_weekday::year_month_weekday(const local_days& dp) NOEXCEPT
-    : year_month_weekday(from_days(dp.time_since_epoch()))
-    {}
-
-CONSTCD14
-inline
-year_month_weekday&
-year_month_weekday::operator+=(const months& m) NOEXCEPT
-{
-    *this = *this + m;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month_weekday&
-year_month_weekday::operator-=(const months& m) NOEXCEPT
-{
-    *this = *this - m;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month_weekday&
-year_month_weekday::operator+=(const years& y) NOEXCEPT
-{
-    *this = *this + y;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month_weekday&
-year_month_weekday::operator-=(const years& y) NOEXCEPT
-{
-    *this = *this - y;
-    return *this;
-}
-
-CONSTCD11 inline year year_month_weekday::year() const NOEXCEPT {return y_;}
-CONSTCD11 inline month year_month_weekday::month() const NOEXCEPT {return m_;}
-
-CONSTCD11
-inline
-weekday
-year_month_weekday::weekday() const NOEXCEPT
-{
-    return wdi_.weekday();
-}
-
-CONSTCD11
-inline
-unsigned
-year_month_weekday::index() const NOEXCEPT
-{
-    return wdi_.index();
-}
-
-CONSTCD11
-inline
-weekday_indexed
-year_month_weekday::weekday_indexed() const NOEXCEPT
-{
-    return wdi_;
-}
-
-CONSTCD14
-inline
-year_month_weekday::operator sys_days() const NOEXCEPT
-{
-    return sys_days{to_days()};
-}
-
-CONSTCD14
-inline
-year_month_weekday::operator local_days() const NOEXCEPT
-{
-    return local_days{to_days()};
-}
-
-CONSTCD14
-inline
-bool
-year_month_weekday::ok() const NOEXCEPT
-{
-    if (!y_.ok() || !m_.ok() || !wdi_.weekday().ok() || wdi_.index() < 1)
-        return false;
-    if (wdi_.index() <= 4)
-        return true;
-    auto d2 = wdi_.weekday() - julian::weekday(y_/m_/1) + days((wdi_.index()-1)*7 + 1);
-    return static_cast<unsigned>(d2.count()) <= static_cast<unsigned>((y_/m_/last).day());
-}
-
-CONSTCD14
-inline
-year_month_weekday
-year_month_weekday::from_days(days d) NOEXCEPT
-{
-    sys_days dp{d};
-    auto const wd = julian::weekday(dp);
-    auto const ymd = year_month_day(dp);
-    return {ymd.year(), ymd.month(), wd[(static_cast<unsigned>(ymd.day())-1)/7+1]};
-}
-
-CONSTCD14
-inline
-days
-year_month_weekday::to_days() const NOEXCEPT
-{
-    auto d = sys_days(y_/m_/1);
-    return (d + (wdi_.weekday() - julian::weekday(d) + days{(wdi_.index()-1)*7})
-           ).time_since_epoch();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT
-{
-    return x.year() == y.year() && x.month() == y.month() &&
-           x.weekday_indexed() == y.weekday_indexed();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_weekday& ymwdi)
-{
-    return os << ymwdi.year() << '/' << ymwdi.month()
-              << '/' << ymwdi.weekday_indexed();
-}
-
-CONSTCD14
-inline
-year_month_weekday
-operator+(const year_month_weekday& ymwd, const months& dm) NOEXCEPT
-{
-    return (ymwd.year() / ymwd.month() + dm) / ymwd.weekday_indexed();
-}
-
-CONSTCD14
-inline
-year_month_weekday
-operator+(const months& dm, const year_month_weekday& ymwd) NOEXCEPT
-{
-    return ymwd + dm;
-}
-
-CONSTCD14
-inline
-year_month_weekday
-operator-(const year_month_weekday& ymwd, const months& dm) NOEXCEPT
-{
-    return ymwd + (-dm);
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator+(const year_month_weekday& ymwd, const years& dy) NOEXCEPT
-{
-    return {ymwd.year()+dy, ymwd.month(), ymwd.weekday_indexed()};
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator+(const years& dy, const year_month_weekday& ymwd) NOEXCEPT
-{
-    return ymwd + dy;
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator-(const year_month_weekday& ymwd, const years& dy) NOEXCEPT
-{
-    return ymwd + (-dy);
-}
-
-// year_month_weekday_last
-
-CONSTCD11
-inline
-year_month_weekday_last::year_month_weekday_last(const julian::year& y,
-                                                 const julian::month& m,
-                                                 const julian::weekday_last& wdl) NOEXCEPT
-    : y_(y)
-    , m_(m)
-    , wdl_(wdl)
-    {}
-
-CONSTCD14
-inline
-year_month_weekday_last&
-year_month_weekday_last::operator+=(const months& m) NOEXCEPT
-{
-    *this = *this + m;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month_weekday_last&
-year_month_weekday_last::operator-=(const months& m) NOEXCEPT
-{
-    *this = *this - m;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month_weekday_last&
-year_month_weekday_last::operator+=(const years& y) NOEXCEPT
-{
-    *this = *this + y;
-    return *this;
-}
-
-CONSTCD14
-inline
-year_month_weekday_last&
-year_month_weekday_last::operator-=(const years& y) NOEXCEPT
-{
-    *this = *this - y;
-    return *this;
-}
-
-CONSTCD11 inline year year_month_weekday_last::year() const NOEXCEPT {return y_;}
-CONSTCD11 inline month year_month_weekday_last::month() const NOEXCEPT {return m_;}
-
-CONSTCD11
-inline
-weekday
-year_month_weekday_last::weekday() const NOEXCEPT
-{
-    return wdl_.weekday();
-}
-
-CONSTCD11
-inline
-weekday_last
-year_month_weekday_last::weekday_last() const NOEXCEPT
-{
-    return wdl_;
-}
-
-CONSTCD14
-inline
-year_month_weekday_last::operator sys_days() const NOEXCEPT
-{
-    return sys_days{to_days()};
-}
-
-CONSTCD14
-inline
-year_month_weekday_last::operator local_days() const NOEXCEPT
-{
-    return local_days{to_days()};
-}
-
-CONSTCD11
-inline
-bool
-year_month_weekday_last::ok() const NOEXCEPT
-{
-    return y_.ok() && m_.ok() && wdl_.ok();
-}
-
-CONSTCD14
-inline
-days
-year_month_weekday_last::to_days() const NOEXCEPT
-{
-    auto const d = sys_days(y_/m_/last);
-    return (d - (julian::weekday{d} - wdl_.weekday())).time_since_epoch();
-}
-
-CONSTCD11
-inline
-bool
-operator==(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT
-{
-    return x.year() == y.year() && x.month() == y.month() &&
-           x.weekday_last() == y.weekday_last();
-}
-
-CONSTCD11
-inline
-bool
-operator!=(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT
-{
-    return !(x == y);
-}
-
-template<class CharT, class Traits>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const year_month_weekday_last& ymwdl)
-{
-    return os << ymwdl.year() << '/' << ymwdl.month() << '/' << ymwdl.weekday_last();
-}
-
-CONSTCD14
-inline
-year_month_weekday_last
-operator+(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT
-{
-    return (ymwdl.year() / ymwdl.month() + dm) / ymwdl.weekday_last();
-}
-
-CONSTCD14
-inline
-year_month_weekday_last
-operator+(const months& dm, const year_month_weekday_last& ymwdl) NOEXCEPT
-{
-    return ymwdl + dm;
-}
-
-CONSTCD14
-inline
-year_month_weekday_last
-operator-(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT
-{
-    return ymwdl + (-dm);
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator+(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT
-{
-    return {ymwdl.year()+dy, ymwdl.month(), ymwdl.weekday_last()};
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator+(const years& dy, const year_month_weekday_last& ymwdl) NOEXCEPT
-{
-    return ymwdl + dy;
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator-(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT
-{
-    return ymwdl + (-dy);
-}
-
-// year_month from operator/()
-
-CONSTCD11
-inline
-year_month
-operator/(const year& y, const month& m) NOEXCEPT
-{
-    return {y, m};
-}
-
-CONSTCD11
-inline
-year_month
-operator/(const year& y, int   m) NOEXCEPT
-{
-    return y / month(static_cast<unsigned>(m));
-}
-
-// month_day from operator/()
-
-CONSTCD11
-inline
-month_day
-operator/(const month& m, const day& d) NOEXCEPT
-{
-    return {m, d};
-}
-
-CONSTCD11
-inline
-month_day
-operator/(const day& d, const month& m) NOEXCEPT
-{
-    return m / d;
-}
-
-CONSTCD11
-inline
-month_day
-operator/(const month& m, int d) NOEXCEPT
-{
-    return m / day(static_cast<unsigned>(d));
-}
-
-CONSTCD11
-inline
-month_day
-operator/(int m, const day& d) NOEXCEPT
-{
-    return month(static_cast<unsigned>(m)) / d;
-}
-
-CONSTCD11 inline month_day operator/(const day& d, int m) NOEXCEPT {return m / d;}
-
-// month_day_last from operator/()
-
-CONSTCD11
-inline
-month_day_last
-operator/(const month& m, last_spec) NOEXCEPT
-{
-    return month_day_last{m};
-}
-
-CONSTCD11
-inline
-month_day_last
-operator/(last_spec, const month& m) NOEXCEPT
-{
-    return m/last;
-}
-
-CONSTCD11
-inline
-month_day_last
-operator/(int m, last_spec) NOEXCEPT
-{
-    return month(static_cast<unsigned>(m))/last;
-}
-
-CONSTCD11
-inline
-month_day_last
-operator/(last_spec, int m) NOEXCEPT
-{
-    return m/last;
-}
-
-// month_weekday from operator/()
-
-CONSTCD11
-inline
-month_weekday
-operator/(const month& m, const weekday_indexed& wdi) NOEXCEPT
-{
-    return {m, wdi};
-}
-
-CONSTCD11
-inline
-month_weekday
-operator/(const weekday_indexed& wdi, const month& m) NOEXCEPT
-{
-    return m / wdi;
-}
-
-CONSTCD11
-inline
-month_weekday
-operator/(int m, const weekday_indexed& wdi) NOEXCEPT
-{
-    return month(static_cast<unsigned>(m)) / wdi;
-}
-
-CONSTCD11
-inline
-month_weekday
-operator/(const weekday_indexed& wdi, int m) NOEXCEPT
-{
-    return m / wdi;
-}
-
-// month_weekday_last from operator/()
-
-CONSTCD11
-inline
-month_weekday_last
-operator/(const month& m, const weekday_last& wdl) NOEXCEPT
-{
-    return {m, wdl};
-}
-
-CONSTCD11
-inline
-month_weekday_last
-operator/(const weekday_last& wdl, const month& m) NOEXCEPT
-{
-    return m / wdl;
-}
-
-CONSTCD11
-inline
-month_weekday_last
-operator/(int m, const weekday_last& wdl) NOEXCEPT
-{
-    return month(static_cast<unsigned>(m)) / wdl;
-}
-
-CONSTCD11
-inline
-month_weekday_last
-operator/(const weekday_last& wdl, int m) NOEXCEPT
-{
-    return m / wdl;
-}
-
-// year_month_day from operator/()
-
-CONSTCD11
-inline
-year_month_day
-operator/(const year_month& ym, const day& d) NOEXCEPT
-{
-    return {ym.year(), ym.month(), d};
-}
-
-CONSTCD11
-inline
-year_month_day
-operator/(const year_month& ym, int d)  NOEXCEPT
-{
-    return ym / day(static_cast<unsigned>(d));
-}
-
-CONSTCD11
-inline
-year_month_day
-operator/(const year& y, const month_day& md) NOEXCEPT
-{
-    return y / md.month() / md.day();
-}
-
-CONSTCD11
-inline
-year_month_day
-operator/(int y, const month_day& md) NOEXCEPT
-{
-    return year(y) / md;
-}
-
-CONSTCD11
-inline
-year_month_day
-operator/(const month_day& md, const year& y)  NOEXCEPT
-{
-    return y / md;
-}
-
-CONSTCD11
-inline
-year_month_day
-operator/(const month_day& md, int y) NOEXCEPT
-{
-    return year(y) / md;
-}
-
-// year_month_day_last from operator/()
-
-CONSTCD11
-inline
-year_month_day_last
-operator/(const year_month& ym, last_spec) NOEXCEPT
-{
-    return {ym.year(), month_day_last{ym.month()}};
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator/(const year& y, const month_day_last& mdl) NOEXCEPT
-{
-    return {y, mdl};
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator/(int y, const month_day_last& mdl) NOEXCEPT
-{
-    return year(y) / mdl;
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator/(const month_day_last& mdl, const year& y) NOEXCEPT
-{
-    return y / mdl;
-}
-
-CONSTCD11
-inline
-year_month_day_last
-operator/(const month_day_last& mdl, int y) NOEXCEPT
-{
-    return year(y) / mdl;
-}
-
-// year_month_weekday from operator/()
-
-CONSTCD11
-inline
-year_month_weekday
-operator/(const year_month& ym, const weekday_indexed& wdi) NOEXCEPT
-{
-    return {ym.year(), ym.month(), wdi};
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator/(const year& y, const month_weekday& mwd) NOEXCEPT
-{
-    return {y, mwd.month(), mwd.weekday_indexed()};
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator/(int y, const month_weekday& mwd) NOEXCEPT
-{
-    return year(y) / mwd;
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator/(const month_weekday& mwd, const year& y) NOEXCEPT
-{
-    return y / mwd;
-}
-
-CONSTCD11
-inline
-year_month_weekday
-operator/(const month_weekday& mwd, int y) NOEXCEPT
-{
-    return year(y) / mwd;
-}
-
-// year_month_weekday_last from operator/()
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator/(const year_month& ym, const weekday_last& wdl) NOEXCEPT
-{
-    return {ym.year(), ym.month(), wdl};
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator/(const year& y, const month_weekday_last& mwdl) NOEXCEPT
-{
-    return {y, mwdl.month(), mwdl.weekday_last()};
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator/(int y, const month_weekday_last& mwdl) NOEXCEPT
-{
-    return year(y) / mwdl;
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator/(const month_weekday_last& mwdl, const year& y) NOEXCEPT
-{
-    return y / mwdl;
-}
-
-CONSTCD11
-inline
-year_month_weekday_last
-operator/(const month_weekday_last& mwdl, int y) NOEXCEPT
-{
-    return year(y) / mwdl;
-}
-
-}  // namespace julian
-
-#endif  // JULIAN_H




diff --git a/src/libs/date/includes/date/ptz.h b/src/libs/date/includes/date/ptz.h
deleted file mode 100644
index 6ff1ab9bb822e89bae7f0b2392a145868f24b514..0000000000000000000000000000000000000000
--- a/src/libs/date/includes/date/ptz.h
+++ /dev/null
@@ -1,627 +0,0 @@
-#ifndef PTZ_H
-#define PTZ_H
-
-// The MIT License (MIT)
-//
-// Copyright (c) 2017 Howard Hinnant
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// This header allows Posix-style time zones as specified for TZ here:
-// http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html#tag_08_03
-//
-// Posix::time_zone can be constructed with a posix-style string and then used in
-// a zoned_time like so:
-//
-// zoned_time<system_clock::duration, Posix::time_zone> zt{"EST5EDT,M3.2.0,M11.1.0",
-//                                                         system_clock::now()};
-// or:
-//
-// Posix::time_zone tz{"EST5EDT,M3.2.0,M11.1.0"};
-// zoned_time<system_clock::duration, Posix::time_zone> zt{tz, system_clock::now()};
-//
-// Note, Posix-style time zones are not recommended for all of the reasons described here:
-// https://stackoverflow.com/tags/timezone/info
-//
-// They are provided here as a non-trivial custom time zone example, and if you really
-// have to have Posix time zones, you're welcome to use this one.
-
-#include "date/tz.h"
-#include <cctype>
-#include <ostream>
-#include <string>
-
-namespace Posix
-{
-
-namespace detail
-{
-
-#if HAS_STRING_VIEW
-
-using string_t = std::string_view;
-
-#else  // !HAS_STRING_VIEW
-
-using string_t = std::string;
-
-#endif  // !HAS_STRING_VIEW
-
-class rule;
-
-void throw_invalid(const string_t& s, unsigned i, const string_t& message);
-unsigned read_date(const string_t& s, unsigned i, rule& r);
-unsigned read_name(const string_t& s, unsigned i, std::string& name);
-unsigned read_signed_time(const string_t& s, unsigned i, std::chrono::seconds& t);
-unsigned read_unsigned_time(const string_t& s, unsigned i, std::chrono::seconds& t);
-unsigned read_unsigned(const string_t& s, unsigned i,  unsigned limit, unsigned& u);
-
-class rule
-{
-    enum {off, J, M, N};
-
-    date::month m_;
-    date::weekday wd_;
-    unsigned short n_    : 14;
-    unsigned short mode_ : 2;
-    std::chrono::duration<std::int32_t> time_ = std::chrono::hours{2};
-
-public:
-    rule() : mode_(off) {}
-
-    bool ok() const {return mode_ != off;}
-    date::local_seconds operator()(date::year y) const;
-
-    friend std::ostream& operator<<(std::ostream& os, const rule& r);
-    friend unsigned read_date(const string_t& s, unsigned i, rule& r);
-};
-
-inline
-date::local_seconds
-rule::operator()(date::year y) const
-{
-    using date::local_days;
-    using date::January;
-    using date::days;
-    using date::last;
-    using sec = std::chrono::seconds;
-    date::local_seconds t;
-    switch (mode_)
-    {
-    case J:
-        t = local_days{y/January/0} + days{n_ + (y.is_leap() && n_ > 59)} + sec{time_};
-        break;
-    case M:
-        t = (n_ == 5 ? local_days{y/m_/wd_[last]} : local_days{y/m_/wd_[n_]}) + sec{time_};
-        break;
-    case N:
-        t = local_days{y/January/1} + days{n_} + sec{time_};
-        break;
-    default:
-        assert(!"rule called with bad mode");
-    }
-    return t;
-}
-
-inline
-std::ostream&
-operator<<(std::ostream& os, const rule& r)
-{
-    switch (r.mode_)
-    {
-    case rule::J:
-        os << 'J' << r.n_ << date::format(" %T", r.time_);
-        break;
-    case rule::M:
-        if (r.n_ == 5)
-            os << r.m_/r.wd_[date::last];
-        else
-            os << r.m_/r.wd_[r.n_];
-        os <<  date::format(" %T", r.time_);
-        break;
-    case rule::N:
-        os << r.n_ << date::format(" %T", r.time_);
-        break;
-    default:
-        break;
-    }
-    return os;
-}
-
-}  // namespace detail
-
-class time_zone
-{
-    std::string          std_abbrev_;
-    std::string          dst_abbrev_ = {};
-    std::chrono::seconds offset_;
-    std::chrono::seconds save_ = std::chrono::hours{1};
-    detail::rule         start_rule_;
-    detail::rule         end_rule_;
-
-public:
-    explicit time_zone(const detail::string_t& name);
-
-    template <class Duration>
-        date::sys_info   get_info(date::sys_time<Duration> st) const;
-    template <class Duration>
-        date::local_info get_info(date::local_time<Duration> tp) const;
-
-    template <class Duration>
-        date::sys_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-        to_sys(date::local_time<Duration> tp) const;
-
-    template <class Duration>
-        date::sys_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-        to_sys(date::local_time<Duration> tp, date::choose z) const;
-
-    template <class Duration>
-        date::local_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-        to_local(date::sys_time<Duration> tp) const;
-
-    friend std::ostream& operator<<(std::ostream& os, const time_zone& z);
-
-    const time_zone* operator->() const {return this;}
-};
-
-inline
-time_zone::time_zone(const detail::string_t& s)
-{
-    using detail::read_name;
-    using detail::read_signed_time;
-    using detail::throw_invalid;
-    auto i = read_name(s, 0, std_abbrev_);
-    i = read_signed_time(s, i, offset_);
-    offset_ = -offset_;
-    if (i != s.size())
-    {
-        i = read_name(s, i, dst_abbrev_);
-        if (i != s.size())
-        {
-            if (s[i] != ',')
-                i = read_signed_time(s, i, save_);
-            if (i != s.size())
-            {
-                if (s[i] != ',')
-                    throw_invalid(s, i, "Expecting end of string or ',' to start rule");
-                ++i;
-                i = read_date(s, i, start_rule_);
-                if (i == s.size() || s[i] != ',')
-                    throw_invalid(s, i, "Expecting ',' and then the ending rule");
-                ++i;
-                i = read_date(s, i, end_rule_);
-                if (i != s.size())
-                    throw_invalid(s, i, "Found unexpected trailing characters");
-            }
-        }
-    }
-}
-
-template <class Duration>
-date::sys_info
-time_zone::get_info(date::sys_time<Duration> st) const
-{
-    using date::sys_info;
-    using date::year_month_day;
-    using date::sys_seconds;
-    using date::sys_days;
-    using date::floor;
-    using date::ceil;
-    using date::days;
-    using date::years;
-    using date::year;
-    using date::January;
-    using date::December;
-    using date::last;
-    using std::chrono::minutes;
-    sys_info r{};
-    r.offset = offset_;
-    if (start_rule_.ok())
-    {
-        auto y = year_month_day{floor<days>(st)}.year();
-        auto start = sys_seconds{(start_rule_(y) - offset_).time_since_epoch()};
-        auto end   = sys_seconds{(end_rule_(y) - (offset_ + save_)).time_since_epoch()};
-        if (start <= st && st < end)
-        {
-            r.begin = start;
-            r.end = end;
-            r.offset += save_;
-            r.save = ceil<minutes>(save_);
-            r.abbrev = dst_abbrev_;
-        }
-        else if (st < start)
-        {
-            r.begin = sys_seconds{(end_rule_(y-years{1}) -
-                                   (offset_ + save_)).time_since_epoch()};
-            r.end = start;
-            r.abbrev = std_abbrev_;
-        }
-        else  // st >= end
-        {
-            r.begin = end;
-            r.end = sys_seconds{(start_rule_(y+years{1}) - offset_).time_since_epoch()};
-            r.abbrev = std_abbrev_;
-        }
-    }
-    else  //  constant offset
-    {
-        r.begin = sys_days{year::min()/January/1};
-        r.end   = sys_days{year::max()/December/last};
-        r.abbrev = std_abbrev_;
-    }
-    return r;
-}
-
-template <class Duration>
-date::local_info
-time_zone::get_info(date::local_time<Duration> tp) const
-{
-    using date::local_info;
-    using date::year_month_day;
-    using date::days;
-    using date::sys_days;
-    using date::sys_seconds;
-    using date::years;
-    using date::year;
-    using date::ceil;
-    using date::January;
-    using date::December;
-    using date::last;
-    using std::chrono::seconds;
-    using std::chrono::minutes;
-    local_info r{};
-    using date::floor;
-    if (start_rule_.ok())
-    {
-        auto y = year_month_day{floor<days>(tp)}.year();
-        auto start = sys_seconds{(start_rule_(y) - offset_).time_since_epoch()};
-        auto end   = sys_seconds{(end_rule_(y) - (offset_ + save_)).time_since_epoch()};
-        auto utcs = sys_seconds{floor<seconds>(tp - offset_).time_since_epoch()};
-        auto utcd = sys_seconds{floor<seconds>(tp - (offset_ + save_)).time_since_epoch()};
-        if ((utcs < start) != (utcd < start))
-        {
-            r.first.begin = sys_seconds{(end_rule_(y-years{1}) -
-                                         (offset_ + save_)).time_since_epoch()};
-            r.first.end = start;
-            r.first.offset = offset_;
-            r.first.abbrev = std_abbrev_;
-            r.second.begin = start;
-            r.second.end = end;
-            r.second.abbrev = dst_abbrev_;
-            r.second.offset = offset_ + save_;
-            r.second.save = ceil<minutes>(save_);
-            r.result = save_ > seconds{0} ? local_info::nonexistent
-                                          : local_info::ambiguous;
-        }
-        else if ((utcs < end) != (utcd < end))
-        {
-            r.first.begin = start;
-            r.first.end = end;
-            r.first.offset = offset_ + save_;
-            r.first.save = ceil<minutes>(save_);
-            r.first.abbrev = dst_abbrev_;
-            r.second.begin = end;
-            r.second.end = sys_seconds{(start_rule_(y+years{1}) -
-                                        offset_).time_since_epoch()};
-            r.second.abbrev = std_abbrev_;
-            r.second.offset = offset_;
-            r.result = save_ > seconds{0} ? local_info::ambiguous
-                                          : local_info::nonexistent;
-        }
-        else if (utcs < start)
-        {
-            r.first.begin = sys_seconds{(end_rule_(y-years{1}) -
-                                   (offset_ + save_)).time_since_epoch()};
-            r.first.end = start;
-            r.first.offset = offset_;
-            r.first.abbrev = std_abbrev_;
-        }
-        else if (utcs < end)
-        {
-            r.first.begin = start;
-            r.first.end = end;
-            r.first.offset = offset_ + save_;
-            r.first.save = ceil<minutes>(save_);
-            r.first.abbrev = dst_abbrev_;
-        }
-        else
-        {
-            r.first.begin = end;
-            r.first.end = sys_seconds{(start_rule_(y+years{1}) -
-                                       offset_).time_since_epoch()};
-            r.first.abbrev = std_abbrev_;
-            r.first.offset = offset_;
-        }
-    }
-    else  //  constant offset
-    {
-        r.first.begin = sys_days{year::min()/January/1};
-        r.first.end   = sys_days{year::max()/December/last};
-        r.first.abbrev = std_abbrev_;
-        r.first.offset = offset_;
-    }
-    return r;
-}
-
-template <class Duration>
-date::sys_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-time_zone::to_sys(date::local_time<Duration> tp) const
-{
-    using date::local_info;
-    using date::sys_time;
-    using date::ambiguous_local_time;
-    auto i = get_info(tp);
-    if (i.result == local_info::nonexistent)
-        throw nonexistent_local_time(tp, i);
-    else if (i.result == local_info::ambiguous)
-        throw ambiguous_local_time(tp, i);
-    return sys_time<Duration>{tp.time_since_epoch()} - i.first.offset;
-}
-
-template <class Duration>
-date::sys_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-time_zone::to_sys(date::local_time<Duration> tp, date::choose z) const
-{
-    using date::local_info;
-    using date::sys_time;
-    using date::choose;
-    auto i = get_info(tp);
-    if (i.result == local_info::nonexistent)
-    {
-        return i.first.end;
-    }
-    else if (i.result == local_info::ambiguous)
-    {
-        if (z == choose::latest)
-            return sys_time<Duration>{tp.time_since_epoch()} - i.second.offset;
-    }
-    return sys_time<Duration>{tp.time_since_epoch()} - i.first.offset;
-}
-
-template <class Duration>
-date::local_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-time_zone::to_local(date::sys_time<Duration> tp) const
-{
-    using date::local_time;
-    using std::chrono::seconds;
-    using LT = local_time<typename std::common_type<Duration, seconds>::type>;
-    auto i = get_info(tp);
-    return LT{(tp + i.offset).time_since_epoch()};
-}
-
-inline
-std::ostream&
-operator<<(std::ostream& os, const time_zone& z)
-{
-    using date::operator<<;
-    os << '{';
-    os << z.std_abbrev_ << ", " << z.dst_abbrev_ << date::format(", %T, ", z.offset_)
-       << date::format("%T, [", z.save_) << z.start_rule_ << ", " << z.end_rule_ << ")}";
-    return os;
-}
-
-namespace detail
-{
-
-inline
-void
-throw_invalid(const string_t& s, unsigned i, const string_t& message)
-{
-    throw std::runtime_error(std::string("Invalid time_zone initializer.\n") +
-                             std::string(message) + ":\n" +
-                             std::string(s) + '\n' +
-                             "\x1b[1;32m" +
-                             std::string(i, '~') + '^' +
-                             std::string(s.size()-i-1, '~') +
-                             "\x1b[0m");
-}
-
-inline
-unsigned
-read_date(const string_t& s, unsigned i, rule& r)
-{
-    using date::month;
-    using date::weekday;
-    if (i == s.size())
-        throw_invalid(s, i, "Expected rule but found end of string");
-    if (s[i] == 'J')
-    {
-        ++i;
-        unsigned n;
-        i = read_unsigned(s, i, 3, n);
-        r.mode_ = rule::J;
-        r.n_ = n;
-    }
-    else if (s[i] == 'M')
-    {
-        ++i;
-        unsigned m;
-        i = read_unsigned(s, i, 2, m);
-        if (i == s.size() || s[i] != '.')
-            throw_invalid(s, i, "Expected '.' after month");
-        ++i;
-        unsigned n;
-        i = read_unsigned(s, i, 1, n);
-        if (i == s.size() || s[i] != '.')
-            throw_invalid(s, i, "Expected '.' after weekday index");
-        ++i;
-        unsigned wd;
-        i = read_unsigned(s, i, 1, wd);
-        r.mode_ = rule::M;
-        r.m_ = month{m};
-        r.wd_ = weekday{wd};
-        r.n_ = n;
-    }
-    else if (std::isdigit(s[i]))
-    {
-        unsigned n;
-        i = read_unsigned(s, i, 3, n);
-        r.mode_ = rule::N;
-        r.n_ = n;
-    }
-    else
-        throw_invalid(s, i, "Expected 'J', 'M', or a digit to start rule");
-    if (i != s.size() && s[i] == '/')
-    {
-        ++i;
-        std::chrono::seconds t;
-        i = read_unsigned_time(s, i, t);
-        r.time_ = t;
-    }
-    return i;
-}
-
-inline
-unsigned
-read_name(const string_t& s, unsigned i, std::string& name)
-{
-    if (i == s.size())
-        throw_invalid(s, i, "Expected a name but found end of string");
-    if (s[i] == '<')
-    {
-        ++i;
-        while (true)
-        {
-            if (i == s.size())
-                throw_invalid(s, i,
-                              "Expected to find closing '>', but found end of string");
-            if (s[i] == '>')
-                break;
-            name.push_back(s[i]);
-            ++i;
-        }
-        ++i;
-    }
-    else
-    {
-        while (i != s.size() && std::isalpha(s[i]))
-        {
-            name.push_back(s[i]);
-            ++i;
-        }
-    }
-    if (name.size() < 3)
-        throw_invalid(s, i, "Found name to be shorter than 3 characters");
-    return i;
-}
-
-inline
-unsigned
-read_signed_time(const string_t& s, unsigned i,
-                                  std::chrono::seconds& t)
-{
-    if (i == s.size())
-        throw_invalid(s, i, "Expected to read signed time, but found end of string");
-    bool negative = false;
-    if (s[i] == '-')
-    {
-        negative = true;
-        ++i;
-    }
-    else if (s[i] == '+')
-        ++i;
-    i = read_unsigned_time(s, i, t);
-    if (negative)
-        t = -t;
-    return i;
-}
-
-inline
-unsigned
-read_unsigned_time(const string_t& s, unsigned i, std::chrono::seconds& t)
-{
-    using std::chrono::seconds;
-    using std::chrono::minutes;
-    using std::chrono::hours;
-    if (i == s.size())
-        throw_invalid(s, i, "Expected to read unsigned time, but found end of string");
-    unsigned x;
-    i = read_unsigned(s, i, 2, x);
-    t = hours{x};
-    if (i != s.size() && s[i] == ':')
-    {
-        ++i;
-        i = read_unsigned(s, i, 2, x);
-        t += minutes{x};
-        if (i != s.size() && s[i] == ':')
-        {
-            ++i;
-            i = read_unsigned(s, i, 2, x);
-            t += seconds{x};
-        }
-    }
-    return i;
-}
-
-inline
-unsigned
-read_unsigned(const string_t& s, unsigned i, unsigned limit, unsigned& u)
-{
-    if (i == s.size() || !std::isdigit(s[i]))
-        throw_invalid(s, i, "Expected to find a decimal digit");
-    u = static_cast<unsigned>(s[i] - '0');
-    unsigned count = 1;
-    for (++i; count < limit && i != s.size() && std::isdigit(s[i]); ++i, ++count)
-        u = u * 10 + static_cast<unsigned>(s[i] - '0');
-    return i;
-}
-
-}  // namespace detail
-
-}  // namespace Posix
-
-namespace date
-{
-
-template <>
-struct zoned_traits<Posix::time_zone>
-{
-
-#if HAS_STRING_VIEW
-
-    static
-    Posix::time_zone
-    locate_zone(std::string_view name)
-    {
-        return Posix::time_zone{name};
-    }
-
-#else  // !HAS_STRING_VIEW
-
-    static
-    Posix::time_zone
-    locate_zone(const std::string& name)
-    {
-        return Posix::time_zone{name};
-    }
-
-    static
-    Posix::time_zone
-    locate_zone(const char* name)
-    {
-        return Posix::time_zone{name};
-    }
-
-#endif  // !HAS_STRING_VIEW
-
-};
-
-}  // namespace date
-
-#endif  // PTZ_H




diff --git a/src/libs/date/includes/date/tz.h b/src/libs/date/includes/date/tz.h
deleted file mode 100644
index 22eac555f15c78c80af288e938a8b41ca71ffed3..0000000000000000000000000000000000000000
--- a/src/libs/date/includes/date/tz.h
+++ /dev/null
@@ -1,2775 +0,0 @@
-#ifndef TZ_H
-#define TZ_H
-
-// The MIT License (MIT)
-//
-// Copyright (c) 2015, 2016, 2017 Howard Hinnant
-// Copyright (c) 2017 Jiangang Zhuang
-// Copyright (c) 2017 Aaron Bishop
-// Copyright (c) 2017 Tomasz KamiƄski
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-//
-// Our apologies.  When the previous paragraph was written, lowercase had not yet
-// been invented (that would involve another several millennia of evolution).
-// We did not mean to shout.
-
-// Get more recent database at http://www.iana.org/time-zones
-
-// The notion of "current timezone" is something the operating system is expected to "just
-// know". How it knows this is system specific. It's often a value set by the user at OS
-// installation time and recorded by the OS somewhere. On Linux and Mac systems the current
-// timezone name is obtained by looking at the name or contents of a particular file on
-// disk. On Windows the current timezone name comes from the registry. In either method,
-// there is no guarantee that the "native" current timezone name obtained will match any
-// of the "Standard" names in this library's "database". On Linux, the names usually do
-// seem to match so mapping functions to map from native to "Standard" are typically not
-// required. On Windows, the names are never "Standard" so mapping is always required.
-// Technically any OS may use the mapping process but currently only Windows does use it.
-
-#ifndef USE_OS_TZDB
-#  define USE_OS_TZDB 0
-#endif
-
-#ifndef HAS_REMOTE_API
-#  if USE_OS_TZDB == 0
-#    ifdef _WIN32
-#      define HAS_REMOTE_API 0
-#    else
-#      define HAS_REMOTE_API 1
-#    endif
-#  else  // HAS_REMOTE_API makes no since when using the OS timezone database
-#    define HAS_REMOTE_API 0
-#  endif
-#endif
-
-#ifdef __clang__
-# pragma clang diagnostic push
-# pragma clang diagnostic ignored "-Wconstant-logical-operand"
-#endif
-
-static_assert(!(USE_OS_TZDB && HAS_REMOTE_API),
-              "USE_OS_TZDB and HAS_REMOTE_API can not be used together");
-
-#ifdef __clang__
-# pragma clang diagnostic pop
-#endif
-
-#ifndef AUTO_DOWNLOAD
-#  define AUTO_DOWNLOAD HAS_REMOTE_API
-#endif
-
-static_assert(HAS_REMOTE_API == 0 ? AUTO_DOWNLOAD == 0 : true,
-              "AUTO_DOWNLOAD can not be turned on without HAS_REMOTE_API");
-
-#ifndef USE_SHELL_API
-#  define USE_SHELL_API 1
-#endif
-
-#if USE_OS_TZDB
-#  ifdef _WIN32
-#    error "USE_OS_TZDB can not be used on Windows"
-#  endif
-#  ifndef MISSING_LEAP_SECONDS
-#    ifdef __APPLE__
-#      define MISSING_LEAP_SECONDS 1
-#    else
-#      define MISSING_LEAP_SECONDS 0
-#    endif
-#  endif
-#else
-#  define MISSING_LEAP_SECONDS 0
-#endif
-
-#ifndef HAS_DEDUCTION_GUIDES
-#  if __cplusplus >= 201703
-#    define HAS_DEDUCTION_GUIDES 1
-#  else
-#    define HAS_DEDUCTION_GUIDES 0
-#  endif
-#endif  // HAS_DEDUCTION_GUIDES
-
-#include "date.h"
-
-#if defined(_MSC_VER) && (_MSC_VER < 1900)
-#include "tz_private.h"
-#endif
-
-#include <algorithm>
-#include <atomic>
-#include <cassert>
-#include <chrono>
-#include <istream>
-#include <locale>
-#include <memory>
-#include <mutex>
-#include <ostream>
-#include <sstream>
-#include <stdexcept>
-#include <string>
-#include <type_traits>
-#include <utility>
-#include <vector>
-
-#ifdef _WIN32
-#  ifdef DATE_BUILD_DLL
-#    define DATE_API __declspec(dllexport)
-#  elif defined(DATE_USE_DLL)
-#    define DATE_API __declspec(dllimport)
-#  else
-#    define DATE_API
-#  endif
-#else
-#  ifdef DATE_BUILD_DLL
-#    define DATE_API __attribute__ ((visibility ("default")))
-#  else
-#    define DATE_API
-#  endif
-#endif
-
-namespace date
-{
-
-enum class choose {earliest, latest};
-
-namespace detail
-{
-    struct undocumented;
-
-    template<typename T>
-    struct nodeduct
-    {
-       using type = T;
-    };
-
-    template<typename T>
-    using nodeduct_t = typename nodeduct<T>::type;
-}
-
-struct sys_info
-{
-    sys_seconds          begin;
-    sys_seconds          end;
-    std::chrono::seconds offset;
-    std::chrono::minutes save;
-    std::string          abbrev;
-};
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const sys_info& r)
-{
-    os << r.begin << '\n';
-    os << r.end << '\n';
-    os << make_time(r.offset) << "\n";
-    os << make_time(r.save) << "\n";
-    os << r.abbrev << '\n';
-    return os;
-}
-
-struct local_info
-{
-    enum {unique, nonexistent, ambiguous} result;
-    sys_info first;
-    sys_info second;
-};
-
-template<class CharT, class Traits>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const local_info& r)
-{
-    if (r.result == local_info::nonexistent)
-        os << "nonexistent between\n";
-    else if (r.result == local_info::ambiguous)
-        os << "ambiguous between\n";
-    os << r.first;
-    if (r.result != local_info::unique)
-    {
-        os << "and\n";
-        os << r.second;
-    }
-    return os;
-}
-
-class nonexistent_local_time
-    : public std::runtime_error
-{
-public:
-    template <class Duration>
-        nonexistent_local_time(local_time<Duration> tp, const local_info& i);
-
-private:
-    template <class Duration>
-    static
-    std::string
-    make_msg(local_time<Duration> tp, const local_info& i);
-};
-
-template <class Duration>
-inline
-nonexistent_local_time::nonexistent_local_time(local_time<Duration> tp,
-                                               const local_info& i)
-    : std::runtime_error(make_msg(tp, i))
-{
-}
-
-template <class Duration>
-std::string
-nonexistent_local_time::make_msg(local_time<Duration> tp, const local_info& i)
-{
-    assert(i.result == local_info::nonexistent);
-    std::ostringstream os;
-    os << tp << " is in a gap between\n"
-       << local_seconds{i.first.end.time_since_epoch()} + i.first.offset << ' '
-       << i.first.abbrev << " and\n"
-       << local_seconds{i.second.begin.time_since_epoch()} + i.second.offset << ' '
-       << i.second.abbrev
-       << " which are both equivalent to\n"
-       << i.first.end << " UTC";
-    return os.str();
-}
-
-class ambiguous_local_time
-    : public std::runtime_error
-{
-public:
-    template <class Duration>
-        ambiguous_local_time(local_time<Duration> tp, const local_info& i);
-
-private:
-    template <class Duration>
-    static
-    std::string
-    make_msg(local_time<Duration> tp, const local_info& i);
-};
-
-template <class Duration>
-inline
-ambiguous_local_time::ambiguous_local_time(local_time<Duration> tp, const local_info& i)
-    : std::runtime_error(make_msg(tp, i))
-{
-}
-
-template <class Duration>
-std::string
-ambiguous_local_time::make_msg(local_time<Duration> tp, const local_info& i)
-{
-    assert(i.result == local_info::ambiguous);
-    std::ostringstream os;
-    os << tp << " is ambiguous.  It could be\n"
-       << tp << ' ' << i.first.abbrev << " == "
-       << tp - i.first.offset << " UTC or\n"
-       << tp << ' ' << i.second.abbrev  << " == "
-       << tp - i.second.offset  << " UTC";
-    return os.str();
-}
-
-class time_zone;
-
-#if HAS_STRING_VIEW
-DATE_API const time_zone* locate_zone(std::string_view tz_name);
-#else
-DATE_API const time_zone* locate_zone(const std::string& tz_name);
-#endif
-
-DATE_API const time_zone* current_zone();
-
-template <class T>
-struct zoned_traits
-{
-};
-
-template <>
-struct zoned_traits<const time_zone*>
-{
-    static
-    const time_zone*
-    default_zone()
-    {
-        return date::locate_zone("Etc/UTC");
-    }
-
-#if HAS_STRING_VIEW
-
-    static
-    const time_zone*
-    locate_zone(std::string_view name)
-    {
-        return date::locate_zone(name);
-    }
-
-#else  // !HAS_STRING_VIEW
-
-    static
-    const time_zone*
-    locate_zone(const std::string& name)
-    {
-        return date::locate_zone(name);
-    }
-
-    static
-    const time_zone*
-    locate_zone(const char* name)
-    {
-        return date::locate_zone(name);
-    }
-
-#endif  // !HAS_STRING_VIEW
-};
-
-template <class Duration, class TimeZonePtr>
-class zoned_time;
-
-template <class Duration1, class Duration2, class TimeZonePtr>
-bool
-operator==(const zoned_time<Duration1, TimeZonePtr>& x,
-           const zoned_time<Duration2, TimeZonePtr>& y);
-
-template <class Duration, class TimeZonePtr = const time_zone*>
-class zoned_time
-{
-public:
-    using duration = typename std::common_type<Duration, std::chrono::seconds>::type;
-
-private:
-    TimeZonePtr        zone_;
-    sys_time<duration> tp_;
-
-public:
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-    template <class T = TimeZonePtr,
-              class = decltype(zoned_traits<T>::default_zone())>
-#endif
-        zoned_time();
-
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-    template <class T = TimeZonePtr,
-              class = decltype(zoned_traits<T>::default_zone())>
-#endif
-        zoned_time(const sys_time<Duration>& st);
-    explicit zoned_time(TimeZonePtr z);
-
-#if HAS_STRING_VIEW
-    template <class T = TimeZonePtr,
-              class = typename std::enable_if
-              <
-                  std::is_constructible
-                  <
-                      zoned_time,
-                      decltype(zoned_traits<T>::locate_zone(std::string_view()))
-                  >::value
-              >::type>
-        explicit zoned_time(std::string_view name);
-#else
-#  if !defined(_MSC_VER) || (_MSC_VER > 1916)
-    template <class T = TimeZonePtr,
-              class = typename std::enable_if
-              <
-                  std::is_constructible
-                  <
-                      zoned_time,
-                      decltype(zoned_traits<T>::locate_zone(std::string()))
-                  >::value
-              >::type>
-#  endif
-        explicit zoned_time(const std::string& name);
-#endif
-
-    template <class Duration2,
-              class = typename std::enable_if
-                      <
-                          std::is_convertible<sys_time<Duration2>,
-                                              sys_time<Duration>>::value
-                      >::type>
-        zoned_time(const zoned_time<Duration2, TimeZonePtr>& zt) NOEXCEPT;
-
-    zoned_time(TimeZonePtr z, const sys_time<Duration>& st);
-
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-    template <class T = TimeZonePtr,
-              class = typename std::enable_if
-              <
-                  std::is_convertible
-                  <
-                      decltype(std::declval<T&>()->to_sys(local_time<Duration>{})),
-                      sys_time<duration>
-                  >::value
-              >::type>
-#endif
-        zoned_time(TimeZonePtr z, const local_time<Duration>& tp);
-
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-    template <class T = TimeZonePtr,
-              class = typename std::enable_if
-              <
-                  std::is_convertible
-                  <
-                      decltype(std::declval<T&>()->to_sys(local_time<Duration>{},
-                                                          choose::earliest)),
-                      sys_time<duration>
-                  >::value
-              >::type>
-#endif
-        zoned_time(TimeZonePtr z, const local_time<Duration>& tp, choose c);
-
-    template <class Duration2, class TimeZonePtr2,
-              class = typename std::enable_if
-                      <
-                          std::is_convertible<sys_time<Duration2>,
-                                              sys_time<Duration>>::value
-                      >::type>
-        zoned_time(TimeZonePtr z, const zoned_time<Duration2, TimeZonePtr2>& zt);
-
-    template <class Duration2, class TimeZonePtr2,
-              class = typename std::enable_if
-                      <
-                          std::is_convertible<sys_time<Duration2>,
-                                              sys_time<Duration>>::value
-                      >::type>
-        zoned_time(TimeZonePtr z, const zoned_time<Duration2, TimeZonePtr2>& zt, choose);
-
-#if HAS_STRING_VIEW
-
-    template <class T = TimeZonePtr,
-              class = typename std::enable_if
-              <
-                  std::is_constructible
-                  <
-                      zoned_time,
-                      decltype(zoned_traits<T>::locate_zone(std::string_view())),
-                      sys_time<Duration>
-                  >::value
-              >::type>
-        zoned_time(std::string_view name, detail::nodeduct_t<const sys_time<Duration>&> st);
-
-    template <class T = TimeZonePtr,
-              class = typename std::enable_if
-              <
-                  std::is_constructible
-                  <
-                      zoned_time,
-                      decltype(zoned_traits<T>::locate_zone(std::string_view())),
-                      local_time<Duration>
-                  >::value
-              >::type>
-        zoned_time(std::string_view name, detail::nodeduct_t<const local_time<Duration>&> tp);
-
-    template <class T = TimeZonePtr,
-              class = typename std::enable_if
-              <
-                  std::is_constructible
-                  <
-                      zoned_time,
-                      decltype(zoned_traits<T>::locate_zone(std::string_view())),
-                      local_time<Duration>,
-                      choose
-                  >::value
-              >::type>
-        zoned_time(std::string_view name, detail::nodeduct_t<const local_time<Duration>&> tp, choose c);
-
-    template <class Duration2, class TimeZonePtr2, class T = TimeZonePtr,
-              class = typename std::enable_if
-                      <
-                          std::is_convertible<sys_time<Duration2>,
-                                              sys_time<Duration>>::value &&
-                          std::is_constructible
-                          <
-                              zoned_time,
-                              decltype(zoned_traits<T>::locate_zone(std::string_view())),
-                              zoned_time
-                          >::value
-                      >::type>
-        zoned_time(std::string_view name, const zoned_time<Duration2, TimeZonePtr2>& zt);
-
-    template <class Duration2, class TimeZonePtr2, class T = TimeZonePtr,
-              class = typename std::enable_if
-                      <
-                          std::is_convertible<sys_time<Duration2>,
-                                              sys_time<Duration>>::value &&
-                          std::is_constructible
-                          <
-                              zoned_time,
-                              decltype(zoned_traits<T>::locate_zone(std::string_view())),
-                              zoned_time,
-                              choose
-                          >::value
-                      >::type>
-        zoned_time(std::string_view name, const zoned_time<Duration2, TimeZonePtr2>& zt, choose);
-
-#else  // !HAS_STRING_VIEW
-
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-    template <class T = TimeZonePtr,
-              class = typename std::enable_if
-              <
-                  std::is_constructible
-                  <
-                      zoned_time,
-                      decltype(zoned_traits<T>::locate_zone(std::string())),
-                      sys_time<Duration>
-                  >::value
-              >::type>
-#endif
-        zoned_time(const std::string& name, const sys_time<Duration>& st);
-
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-    template <class T = TimeZonePtr,
-              class = typename std::enable_if
-              <
-                  std::is_constructible
-                  <
-                      zoned_time,
-                      decltype(zoned_traits<T>::locate_zone(std::string())),
-                      sys_time<Duration>
-                  >::value
-              >::type>
-#endif
-        zoned_time(const char* name, const sys_time<Duration>& st);
-
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-    template <class T = TimeZonePtr,
-              class = typename std::enable_if
-              <
-                  std::is_constructible
-                  <
-                      zoned_time,
-                      decltype(zoned_traits<T>::locate_zone(std::string())),
-                      local_time<Duration>
-                  >::value
-              >::type>
-#endif
-        zoned_time(const std::string& name, const local_time<Duration>& tp);
-
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-    template <class T = TimeZonePtr,
-              class = typename std::enable_if
-              <
-                  std::is_constructible
-                  <
-                      zoned_time,
-                      decltype(zoned_traits<T>::locate_zone(std::string())),
-                      local_time<Duration>
-                  >::value
-              >::type>
-#endif
-        zoned_time(const char* name, const local_time<Duration>& tp);
-
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-    template <class T = TimeZonePtr,
-              class = typename std::enable_if
-              <
-                  std::is_constructible
-                  <
-                      zoned_time,
-                      decltype(zoned_traits<T>::locate_zone(std::string())),
-                      local_time<Duration>,
-                      choose
-                  >::value
-              >::type>
-#endif
-        zoned_time(const std::string& name, const local_time<Duration>& tp, choose c);
-
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-    template <class T = TimeZonePtr,
-              class = typename std::enable_if
-              <
-                  std::is_constructible
-                  <
-                      zoned_time,
-                      decltype(zoned_traits<T>::locate_zone(std::string())),
-                      local_time<Duration>,
-                      choose
-                  >::value
-              >::type>
-#endif
-        zoned_time(const char* name, const local_time<Duration>& tp, choose c);
-
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-    template <class Duration2, class TimeZonePtr2, class T = TimeZonePtr,
-              class = typename std::enable_if
-                      <
-                          std::is_convertible<sys_time<Duration2>,
-                                              sys_time<Duration>>::value &&
-                          std::is_constructible
-                          <
-                              zoned_time,
-                              decltype(zoned_traits<T>::locate_zone(std::string())),
-                              zoned_time
-                          >::value
-                      >::type>
-#else
-    template <class Duration2, class TimeZonePtr2>
-#endif
-        zoned_time(const std::string& name, const zoned_time<Duration2, TimeZonePtr2>& zt);
-
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-    template <class Duration2, class TimeZonePtr2, class T = TimeZonePtr,
-              class = typename std::enable_if
-                      <
-                          std::is_convertible<sys_time<Duration2>,
-                                              sys_time<Duration>>::value &&
-                          std::is_constructible
-                          <
-                              zoned_time,
-                              decltype(zoned_traits<T>::locate_zone(std::string())),
-                              zoned_time
-                          >::value
-                      >::type>
-#else
-    template <class Duration2, class TimeZonePtr2>
-#endif
-        zoned_time(const char* name, const zoned_time<Duration2, TimeZonePtr2>& zt);
-
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-    template <class Duration2, class TimeZonePtr2, class T = TimeZonePtr,
-              class = typename std::enable_if
-                      <
-                          std::is_convertible<sys_time<Duration2>,
-                                              sys_time<Duration>>::value &&
-                          std::is_constructible
-                          <
-                              zoned_time,
-                              decltype(zoned_traits<T>::locate_zone(std::string())),
-                              zoned_time,
-                              choose
-                          >::value
-                      >::type>
-#else
-    template <class Duration2, class TimeZonePtr2>
-#endif
-        zoned_time(const std::string& name, const zoned_time<Duration2, TimeZonePtr2>& zt,
-                   choose);
-
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-    template <class Duration2, class TimeZonePtr2, class T = TimeZonePtr,
-              class = typename std::enable_if
-                      <
-                          std::is_convertible<sys_time<Duration2>,
-                                              sys_time<Duration>>::value &&
-                          std::is_constructible
-                          <
-                              zoned_time,
-                              decltype(zoned_traits<T>::locate_zone(std::string())),
-                              zoned_time,
-                              choose
-                          >::value
-                      >::type>
-#else
-    template <class Duration2, class TimeZonePtr2>
-#endif
-        zoned_time(const char* name, const zoned_time<Duration2, TimeZonePtr2>& zt,
-                   choose);
-
-#endif  // !HAS_STRING_VIEW
-
-    zoned_time& operator=(const sys_time<Duration>& st);
-    zoned_time& operator=(const local_time<Duration>& ut);
-
-    explicit operator sys_time<duration>() const;
-    explicit operator local_time<duration>() const;
-
-    TimeZonePtr          get_time_zone() const;
-    local_time<duration> get_local_time() const;
-    sys_time<duration>   get_sys_time() const;
-    sys_info             get_info() const;
-
-    template <class Duration1, class Duration2, class TimeZonePtr1>
-    friend
-    bool
-    operator==(const zoned_time<Duration1, TimeZonePtr1>& x,
-               const zoned_time<Duration2, TimeZonePtr1>& y);
-
-    template <class CharT, class Traits, class Duration1, class TimeZonePtr1>
-    friend
-    std::basic_ostream<CharT, Traits>&
-    operator<<(std::basic_ostream<CharT, Traits>& os,
-               const zoned_time<Duration1, TimeZonePtr1>& t);
-
-private:
-    template <class D, class T> friend class zoned_time;
-};
-
-using zoned_seconds = zoned_time<std::chrono::seconds>;
-
-#if HAS_DEDUCTION_GUIDES
-
-namespace detail
-{
-   template<typename TimeZonePtrOrName>
-   using time_zone_representation =
-       std::conditional_t
-       <
-           std::is_convertible<TimeZonePtrOrName, std::string_view>::value,
-           time_zone const*,
-           std::remove_cv_t<std::remove_reference_t<TimeZonePtrOrName>>
-       >;
-}
-
-zoned_time()
-    -> zoned_time<std::chrono::seconds>;
-
-template <class Duration>
-zoned_time(sys_time<Duration>)
-    -> zoned_time<std::common_type_t<Duration, std::chrono::seconds>>;
-
-template <class TimeZonePtrOrName>
-zoned_time(TimeZonePtrOrName&&)
-    -> zoned_time<std::chrono::seconds, detail::time_zone_representation<TimeZonePtrOrName>>;
-
-template <class TimeZonePtrOrName, class Duration>
-zoned_time(TimeZonePtrOrName&&, sys_time<Duration>)
-    -> zoned_time<std::common_type_t<Duration, std::chrono::seconds>, detail::time_zone_representation<TimeZonePtrOrName>>;
-
-template <class TimeZonePtrOrName, class Duration>
-zoned_time(TimeZonePtrOrName&&, local_time<Duration>, choose = choose::earliest)
-    -> zoned_time<std::common_type_t<Duration, std::chrono::seconds>, detail::time_zone_representation<TimeZonePtrOrName>>;
-
-template <class Duration, class TimeZonePtrOrName, class TimeZonePtr2>
-zoned_time(TimeZonePtrOrName&&, zoned_time<Duration, TimeZonePtr2>, choose = choose::earliest)
-    -> zoned_time<std::common_type_t<Duration, std::chrono::seconds>, detail::time_zone_representation<TimeZonePtrOrName>>;
-
-#endif  // HAS_DEDUCTION_GUIDES
-
-template <class Duration1, class Duration2, class TimeZonePtr>
-inline
-bool
-operator==(const zoned_time<Duration1, TimeZonePtr>& x,
-           const zoned_time<Duration2, TimeZonePtr>& y)
-{
-    return x.zone_ == y.zone_ && x.tp_ == y.tp_;
-}
-
-template <class Duration1, class Duration2, class TimeZonePtr>
-inline
-bool
-operator!=(const zoned_time<Duration1, TimeZonePtr>& x,
-           const zoned_time<Duration2, TimeZonePtr>& y)
-{
-    return !(x == y);
-}
-
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
-
-namespace detail
-{
-#  if USE_OS_TZDB
-    struct transition;
-    struct expanded_ttinfo;
-#  else  // !USE_OS_TZDB
-    struct zonelet;
-    class Rule;
-#  endif  // !USE_OS_TZDB
-}
-
-#endif  // !defined(_MSC_VER) || (_MSC_VER >= 1900)
-
-class time_zone
-{
-private:
-    std::string                          name_;
-#if USE_OS_TZDB
-    std::vector<detail::transition>      transitions_;
-    std::vector<detail::expanded_ttinfo> ttinfos_;
-#else  // !USE_OS_TZDB
-    std::vector<detail::zonelet>         zonelets_;
-#endif  // !USE_OS_TZDB
-    std::unique_ptr<std::once_flag>      adjusted_;
-
-public:
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
-    time_zone(time_zone&&) = default;
-    time_zone& operator=(time_zone&&) = default;
-#else   // defined(_MSC_VER) && (_MSC_VER < 1900)
-    time_zone(time_zone&& src);
-    time_zone& operator=(time_zone&& src);
-#endif  // defined(_MSC_VER) && (_MSC_VER < 1900)
-
-    DATE_API explicit time_zone(const std::string& s, detail::undocumented);
-
-    const std::string& name() const NOEXCEPT;
-
-    template <class Duration> sys_info   get_info(sys_time<Duration> st) const;
-    template <class Duration> local_info get_info(local_time<Duration> tp) const;
-
-    template <class Duration>
-        sys_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-        to_sys(local_time<Duration> tp) const;
-
-    template <class Duration>
-        sys_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-        to_sys(local_time<Duration> tp, choose z) const;
-
-    template <class Duration>
-        local_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-        to_local(sys_time<Duration> tp) const;
-
-    friend bool operator==(const time_zone& x, const time_zone& y) NOEXCEPT;
-    friend bool operator< (const time_zone& x, const time_zone& y) NOEXCEPT;
-    friend DATE_API std::ostream& operator<<(std::ostream& os, const time_zone& z);
-
-#if !USE_OS_TZDB
-    DATE_API void add(const std::string& s);
-#endif  // !USE_OS_TZDB
-
-private:
-    DATE_API sys_info   get_info_impl(sys_seconds tp) const;
-    DATE_API local_info get_info_impl(local_seconds tp) const;
-
-    template <class Duration>
-        sys_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-        to_sys_impl(local_time<Duration> tp, choose z, std::false_type) const;
-    template <class Duration>
-        sys_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-        to_sys_impl(local_time<Duration> tp, choose, std::true_type) const;
-
-#if USE_OS_TZDB
-    DATE_API void init() const;
-    DATE_API void init_impl();
-    DATE_API sys_info
-        load_sys_info(std::vector<detail::transition>::const_iterator i) const;
-
-    template <class TimeType>
-    DATE_API void
-    load_data(std::istream& inf, std::int32_t tzh_leapcnt, std::int32_t tzh_timecnt,
-                                 std::int32_t tzh_typecnt, std::int32_t tzh_charcnt);
-#else  // !USE_OS_TZDB
-    DATE_API sys_info   get_info_impl(sys_seconds tp, int timezone) const;
-    DATE_API void adjust_infos(const std::vector<detail::Rule>& rules);
-    DATE_API void parse_info(std::istream& in);
-#endif  // !USE_OS_TZDB
-};
-
-#if defined(_MSC_VER) && (_MSC_VER < 1900)
-
-inline
-time_zone::time_zone(time_zone&& src)
-    : name_(std::move(src.name_))
-    , zonelets_(std::move(src.zonelets_))
-    , adjusted_(std::move(src.adjusted_))
-    {}
-
-inline
-time_zone&
-time_zone::operator=(time_zone&& src)
-{
-    name_ = std::move(src.name_);
-    zonelets_ = std::move(src.zonelets_);
-    adjusted_ = std::move(src.adjusted_);
-    return *this;
-}
-
-#endif  // defined(_MSC_VER) && (_MSC_VER < 1900)
-
-inline
-const std::string&
-time_zone::name() const NOEXCEPT
-{
-    return name_;
-}
-
-template <class Duration>
-inline
-sys_info
-time_zone::get_info(sys_time<Duration> st) const
-{
-    return get_info_impl(date::floor<std::chrono::seconds>(st));
-}
-
-template <class Duration>
-inline
-local_info
-time_zone::get_info(local_time<Duration> tp) const
-{
-    return get_info_impl(date::floor<std::chrono::seconds>(tp));
-}
-
-template <class Duration>
-inline
-sys_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-time_zone::to_sys(local_time<Duration> tp) const
-{
-    return to_sys_impl(tp, choose{}, std::true_type{});
-}
-
-template <class Duration>
-inline
-sys_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-time_zone::to_sys(local_time<Duration> tp, choose z) const
-{
-    return to_sys_impl(tp, z, std::false_type{});
-}
-
-template <class Duration>
-inline
-local_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-time_zone::to_local(sys_time<Duration> tp) const
-{
-    using LT = local_time<typename std::common_type<Duration, std::chrono::seconds>::type>;
-    auto i = get_info(tp);
-    return LT{(tp + i.offset).time_since_epoch()};
-}
-
-inline bool operator==(const time_zone& x, const time_zone& y) NOEXCEPT {return x.name_ == y.name_;}
-inline bool operator< (const time_zone& x, const time_zone& y) NOEXCEPT {return x.name_ < y.name_;}
-
-inline bool operator!=(const time_zone& x, const time_zone& y) NOEXCEPT {return !(x == y);}
-inline bool operator> (const time_zone& x, const time_zone& y) NOEXCEPT {return   y < x;}
-inline bool operator<=(const time_zone& x, const time_zone& y) NOEXCEPT {return !(y < x);}
-inline bool operator>=(const time_zone& x, const time_zone& y) NOEXCEPT {return !(x < y);}
-
-template <class Duration>
-sys_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-time_zone::to_sys_impl(local_time<Duration> tp, choose z, std::false_type) const
-{
-    auto i = get_info(tp);
-    if (i.result == local_info::nonexistent)
-    {
-        return i.first.end;
-    }
-    else if (i.result == local_info::ambiguous)
-    {
-        if (z == choose::latest)
-            return sys_time<Duration>{tp.time_since_epoch()} - i.second.offset;
-    }
-    return sys_time<Duration>{tp.time_since_epoch()} - i.first.offset;
-}
-
-template <class Duration>
-sys_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-time_zone::to_sys_impl(local_time<Duration> tp, choose, std::true_type) const
-{
-    auto i = get_info(tp);
-    if (i.result == local_info::nonexistent)
-        throw nonexistent_local_time(tp, i);
-    else if (i.result == local_info::ambiguous)
-        throw ambiguous_local_time(tp, i);
-    return sys_time<Duration>{tp.time_since_epoch()} - i.first.offset;
-}
-
-#if !USE_OS_TZDB
-
-class time_zone_link
-{
-private:
-    std::string name_;
-    std::string target_;
-public:
-    DATE_API explicit time_zone_link(const std::string& s);
-
-    const std::string& name() const {return name_;}
-    const std::string& target() const {return target_;}
-
-    friend bool operator==(const time_zone_link& x, const time_zone_link& y) {return x.name_ == y.name_;}
-    friend bool operator< (const time_zone_link& x, const time_zone_link& y) {return x.name_ < y.name_;}
-
-    friend DATE_API std::ostream& operator<<(std::ostream& os, const time_zone_link& x);
-};
-
-using link = time_zone_link;
-
-inline bool operator!=(const time_zone_link& x, const time_zone_link& y) {return !(x == y);}
-inline bool operator> (const time_zone_link& x, const time_zone_link& y) {return   y < x;}
-inline bool operator<=(const time_zone_link& x, const time_zone_link& y) {return !(y < x);}
-inline bool operator>=(const time_zone_link& x, const time_zone_link& y) {return !(x < y);}
-
-#endif  // !USE_OS_TZDB
-
-#if !MISSING_LEAP_SECONDS
-
-class leap_second
-{
-private:
-    sys_seconds date_;
-
-public:
-#if USE_OS_TZDB
-    DATE_API explicit leap_second(const sys_seconds& s, detail::undocumented);
-#else
-    DATE_API explicit leap_second(const std::string& s, detail::undocumented);
-#endif
-
-    sys_seconds date() const {return date_;}
-
-    friend bool operator==(const leap_second& x, const leap_second& y) {return x.date_ == y.date_;}
-    friend bool operator< (const leap_second& x, const leap_second& y) {return x.date_ < y.date_;}
-
-    template <class Duration>
-    friend
-    bool
-    operator==(const leap_second& x, const sys_time<Duration>& y)
-    {
-        return x.date_ == y;
-    }
-
-    template <class Duration>
-    friend
-    bool
-    operator< (const leap_second& x, const sys_time<Duration>& y)
-    {
-        return x.date_ < y;
-    }
-
-    template <class Duration>
-    friend
-    bool
-    operator< (const sys_time<Duration>& x, const leap_second& y)
-    {
-        return x < y.date_;
-    }
-
-    friend DATE_API std::ostream& operator<<(std::ostream& os, const leap_second& x);
-};
-
-inline bool operator!=(const leap_second& x, const leap_second& y) {return !(x == y);}
-inline bool operator> (const leap_second& x, const leap_second& y) {return   y < x;}
-inline bool operator<=(const leap_second& x, const leap_second& y) {return !(y < x);}
-inline bool operator>=(const leap_second& x, const leap_second& y) {return !(x < y);}
-
-template <class Duration>
-inline
-bool
-operator==(const sys_time<Duration>& x, const leap_second& y)
-{
-    return y == x;
-}
-
-template <class Duration>
-inline
-bool
-operator!=(const leap_second& x, const sys_time<Duration>& y)
-{
-    return !(x == y);
-}
-
-template <class Duration>
-inline
-bool
-operator!=(const sys_time<Duration>& x, const leap_second& y)
-{
-    return !(x == y);
-}
-
-template <class Duration>
-inline
-bool
-operator> (const leap_second& x, const sys_time<Duration>& y)
-{
-    return y < x;
-}
-
-template <class Duration>
-inline
-bool
-operator> (const sys_time<Duration>& x, const leap_second& y)
-{
-    return y < x;
-}
-
-template <class Duration>
-inline
-bool
-operator<=(const leap_second& x, const sys_time<Duration>& y)
-{
-    return !(y < x);
-}
-
-template <class Duration>
-inline
-bool
-operator<=(const sys_time<Duration>& x, const leap_second& y)
-{
-    return !(y < x);
-}
-
-template <class Duration>
-inline
-bool
-operator>=(const leap_second& x, const sys_time<Duration>& y)
-{
-    return !(x < y);
-}
-
-template <class Duration>
-inline
-bool
-operator>=(const sys_time<Duration>& x, const leap_second& y)
-{
-    return !(x < y);
-}
-
-using leap = leap_second;
-
-#endif  // !MISSING_LEAP_SECONDS
-
-#ifdef _WIN32
-
-namespace detail
-{
-
-// The time zone mapping is modelled after this data file:
-// http://unicode.org/repos/cldr/trunk/common/supplemental/windowsZones.xml
-// and the field names match the element names from the mapZone element
-// of windowsZones.xml.
-// The website displays this file here:
-// http://www.unicode.org/cldr/charts/latest/supplemental/zone_tzid.html
-// The html view is sorted before being displayed but is otherwise the same
-// There is a mapping between the os centric view (in this case windows)
-// the html displays uses and the generic view the xml file.
-// That mapping is this:
-// display column "windows" -> xml field "other".
-// display column "region"  -> xml field "territory".
-// display column "tzid"    -> xml field "type".
-// This structure uses the generic terminology because it could be
-// used to to support other os/native name conversions, not just windows,
-// and using the same generic names helps retain the connection to the
-// origin of the data that we are using.
-struct timezone_mapping
-{
-    timezone_mapping(const char* other, const char* territory, const char* type)
-        : other(other), territory(territory), type(type)
-    {
-    }
-    timezone_mapping() = default;
-    std::string other;
-    std::string territory;
-    std::string type;
-};
-
-}  // detail
-
-#endif  // _WIN32
-
-struct tzdb
-{
-    std::string                 version = "unknown";
-    std::vector<time_zone>      zones;
-#if !USE_OS_TZDB
-    std::vector<time_zone_link> links;
-#endif
-#if !MISSING_LEAP_SECONDS
-    std::vector<leap_second>    leap_seconds;
-#endif
-#if !USE_OS_TZDB
-    std::vector<detail::Rule>   rules;
-#endif
-#ifdef _WIN32
-    std::vector<detail::timezone_mapping> mappings;
-#endif
-    tzdb* next = nullptr;
-
-    tzdb() = default;
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
-    tzdb(tzdb&&) = default;
-    tzdb& operator=(tzdb&&) = default;
-#else  // defined(_MSC_VER) && (_MSC_VER < 1900)
-    tzdb(tzdb&& src)
-        : version(std::move(src.version))
-        , zones(std::move(src.zones))
-        , links(std::move(src.links))
-        , leap_seconds(std::move(src.leap_seconds))
-        , rules(std::move(src.rules))
-        , mappings(std::move(src.mappings))
-    {}
-
-    tzdb& operator=(tzdb&& src)
-    {
-        version = std::move(src.version);
-        zones = std::move(src.zones);
-        links = std::move(src.links);
-        leap_seconds = std::move(src.leap_seconds);
-        rules = std::move(src.rules);
-        mappings = std::move(src.mappings);
-        return *this;
-    }
-#endif  // defined(_MSC_VER) && (_MSC_VER < 1900)
-
-#if HAS_STRING_VIEW
-    const time_zone* locate_zone(std::string_view tz_name) const;
-#else
-    const time_zone* locate_zone(const std::string& tz_name) const;
-#endif
-    const time_zone* current_zone() const;
-};
-
-using TZ_DB = tzdb;
-
-DATE_API std::ostream&
-operator<<(std::ostream& os, const tzdb& db);
-
-DATE_API const tzdb& get_tzdb();
-
-class tzdb_list
-{
-    std::atomic<tzdb*> head_{nullptr};
-
-public:
-    ~tzdb_list();
-    tzdb_list() = default;
-    tzdb_list(tzdb_list&& x) noexcept;
-
-    const tzdb& front() const noexcept {return *head_;}
-          tzdb& front()       noexcept {return *head_;}
-
-    class const_iterator;
-
-    const_iterator begin() const noexcept;
-    const_iterator end() const noexcept;
-
-    const_iterator cbegin() const noexcept;
-    const_iterator cend() const noexcept;
-
-    const_iterator erase_after(const_iterator p) noexcept;
-
-    struct undocumented_helper;
-private:
-    void push_front(tzdb* tzdb) noexcept;
-};
-
-class tzdb_list::const_iterator
-{
-    tzdb* p_ = nullptr;
-
-    explicit const_iterator(tzdb* p) noexcept : p_{p} {}
-public:
-    const_iterator() = default;
-
-    using iterator_category = std::forward_iterator_tag;
-    using value_type        = tzdb;
-    using reference         = const value_type&;
-    using pointer           = const value_type*;
-    using difference_type   = std::ptrdiff_t;
-
-    reference operator*() const noexcept {return *p_;}
-    pointer  operator->() const noexcept {return p_;}
-
-    const_iterator& operator++() noexcept {p_ = p_->next; return *this;}
-    const_iterator  operator++(int) noexcept {auto t = *this; ++(*this); return t;}
-
-    friend
-    bool
-    operator==(const const_iterator& x, const const_iterator& y) noexcept
-        {return x.p_ == y.p_;}
-
-    friend
-    bool
-    operator!=(const const_iterator& x, const const_iterator& y) noexcept
-        {return !(x == y);}
-
-    friend class tzdb_list;
-};
-
-inline
-tzdb_list::const_iterator
-tzdb_list::begin() const noexcept
-{
-    return const_iterator{head_};
-}
-
-inline
-tzdb_list::const_iterator
-tzdb_list::end() const noexcept
-{
-    return const_iterator{nullptr};
-}
-
-inline
-tzdb_list::const_iterator
-tzdb_list::cbegin() const noexcept
-{
-    return begin();
-}
-
-inline
-tzdb_list::const_iterator
-tzdb_list::cend() const noexcept
-{
-    return end();
-}
-
-DATE_API tzdb_list& get_tzdb_list();
-
-#if !USE_OS_TZDB
-
-DATE_API const tzdb& reload_tzdb();
-DATE_API void        set_install(const std::string& install);
-
-#endif  // !USE_OS_TZDB
-
-#if HAS_REMOTE_API
-
-DATE_API std::string remote_version();
-// if provided error_buffer size should be at least CURL_ERROR_SIZE
-DATE_API bool        remote_download(const std::string& version, char* error_buffer = nullptr);
-DATE_API bool        remote_install(const std::string& version);
-
-#endif
-
-// zoned_time
-
-namespace detail
-{
-
-template <class T>
-inline
-T*
-to_raw_pointer(T* p) noexcept
-{
-    return p;
-}
-
-template <class Pointer>
-inline
-auto
-to_raw_pointer(Pointer p) noexcept
-    -> decltype(detail::to_raw_pointer(p.operator->()))
-{
-    return detail::to_raw_pointer(p.operator->());
-}
-
-}  // namespace detail
-
-template <class Duration, class TimeZonePtr>
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-template <class T, class>
-#endif
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time()
-    : zone_(zoned_traits<TimeZonePtr>::default_zone())
-    {}
-
-template <class Duration, class TimeZonePtr>
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-template <class T, class>
-#endif
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(const sys_time<Duration>& st)
-    : zone_(zoned_traits<TimeZonePtr>::default_zone())
-    , tp_(st)
-    {}
-
-template <class Duration, class TimeZonePtr>
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(TimeZonePtr z)
-    : zone_(std::move(z))
-    {assert(detail::to_raw_pointer(zone_) != nullptr);}
-
-#if HAS_STRING_VIEW
-
-template <class Duration, class TimeZonePtr>
-template <class T, class>
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(std::string_view name)
-    : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name))
-    {}
-
-#else  // !HAS_STRING_VIEW
-
-template <class Duration, class TimeZonePtr>
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-template <class T, class>
-#endif
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(const std::string& name)
-    : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name))
-    {}
-
-#endif  // !HAS_STRING_VIEW
-
-template <class Duration, class TimeZonePtr>
-template <class Duration2, class>
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(const zoned_time<Duration2, TimeZonePtr>& zt) NOEXCEPT
-    : zone_(zt.zone_)
-    , tp_(zt.tp_)
-    {}
-
-template <class Duration, class TimeZonePtr>
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(TimeZonePtr z, const sys_time<Duration>& st)
-    : zone_(std::move(z))
-    , tp_(st)
-    {}
-
-template <class Duration, class TimeZonePtr>
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-template <class T, class>
-#endif
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(TimeZonePtr z, const local_time<Duration>& t)
-    : zone_(std::move(z))
-    , tp_(zone_->to_sys(t))
-    {}
-
-template <class Duration, class TimeZonePtr>
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-template <class T, class>
-#endif
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(TimeZonePtr z, const local_time<Duration>& t,
-                                              choose c)
-    : zone_(std::move(z))
-    , tp_(zone_->to_sys(t, c))
-    {}
-
-template <class Duration, class TimeZonePtr>
-template <class Duration2, class TimeZonePtr2, class>
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(TimeZonePtr z,
-                                              const zoned_time<Duration2, TimeZonePtr2>& zt)
-    : zone_(std::move(z))
-    , tp_(zt.tp_)
-    {}
-
-template <class Duration, class TimeZonePtr>
-template <class Duration2, class TimeZonePtr2, class>
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(TimeZonePtr z,
-                                      const zoned_time<Duration2, TimeZonePtr2>& zt, choose)
-    : zoned_time(std::move(z), zt)
-    {}
-
-#if HAS_STRING_VIEW
-
-template <class Duration, class TimeZonePtr>
-template <class T, class>
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(std::string_view name,
-                                              detail::nodeduct_t<const sys_time<Duration>&> st)
-    : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), st)
-    {}
-
-template <class Duration, class TimeZonePtr>
-template <class T, class>
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(std::string_view name,
-                                              detail::nodeduct_t<const local_time<Duration>&> t)
-    : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), t)
-    {}
-
-template <class Duration, class TimeZonePtr>
-template <class T, class>
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(std::string_view name,
-                                              detail::nodeduct_t<const local_time<Duration>&> t, choose c)
-    : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), t, c)
-    {}
-
-template <class Duration, class TimeZonePtr>
-template <class Duration2, class TimeZonePtr2, class, class>
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(std::string_view name,
-                                              const zoned_time<Duration2, TimeZonePtr2>& zt)
-    : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), zt)
-    {}
-
-template <class Duration, class TimeZonePtr>
-template <class Duration2, class TimeZonePtr2, class, class>
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(std::string_view name,
-                                              const zoned_time<Duration2, TimeZonePtr2>& zt,
-                                              choose c)
-    : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), zt, c)
-    {}
-
-#else  // !HAS_STRING_VIEW
-
-template <class Duration, class TimeZonePtr>
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-template <class T, class>
-#endif
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(const std::string& name,
-                                              const sys_time<Duration>& st)
-    : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), st)
-    {}
-
-template <class Duration, class TimeZonePtr>
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-template <class T, class>
-#endif
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(const char* name,
-                                              const sys_time<Duration>& st)
-    : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), st)
-    {}
-
-template <class Duration, class TimeZonePtr>
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-template <class T, class>
-#endif
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(const std::string& name,
-                                              const local_time<Duration>& t)
-    : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), t)
-    {}
-
-template <class Duration, class TimeZonePtr>
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-template <class T, class>
-#endif
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(const char* name,
-                                              const local_time<Duration>& t)
-    : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), t)
-    {}
-
-template <class Duration, class TimeZonePtr>
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-template <class T, class>
-#endif
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(const std::string& name,
-                                              const local_time<Duration>& t, choose c)
-    : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), t, c)
-    {}
-
-template <class Duration, class TimeZonePtr>
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-template <class T, class>
-#endif
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(const char* name,
-                                              const local_time<Duration>& t, choose c)
-    : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), t, c)
-    {}
-
-template <class Duration, class TimeZonePtr>
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-template <class Duration2, class TimeZonePtr2, class, class>
-#else
-template <class Duration2, class TimeZonePtr2>
-#endif
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(const std::string& name,
-                                              const zoned_time<Duration2, TimeZonePtr2>& zt)
-    : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), zt)
-    {}
-
-template <class Duration, class TimeZonePtr>
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-template <class Duration2, class TimeZonePtr2, class, class>
-#else
-template <class Duration2, class TimeZonePtr2>
-#endif
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(const char* name,
-                                              const zoned_time<Duration2, TimeZonePtr2>& zt)
-    : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), zt)
-    {}
-
-template <class Duration, class TimeZonePtr>
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-template <class Duration2, class TimeZonePtr2, class, class>
-#else
-template <class Duration2, class TimeZonePtr2>
-#endif
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(const std::string& name,
-                                              const zoned_time<Duration2, TimeZonePtr2>& zt,
-                                              choose c)
-    : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), zt, c)
-    {}
-
-template <class Duration, class TimeZonePtr>
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-template <class Duration2, class TimeZonePtr2, class, class>
-#else
-template <class Duration2, class TimeZonePtr2>
-#endif
-inline
-zoned_time<Duration, TimeZonePtr>::zoned_time(const char* name,
-                                              const zoned_time<Duration2, TimeZonePtr2>& zt,
-                                              choose c)
-    : zoned_time(zoned_traits<TimeZonePtr>::locate_zone(name), zt, c)
-    {}
-
-#endif  // HAS_STRING_VIEW
-
-template <class Duration, class TimeZonePtr>
-inline
-zoned_time<Duration, TimeZonePtr>&
-zoned_time<Duration, TimeZonePtr>::operator=(const sys_time<Duration>& st)
-{
-    tp_ = st;
-    return *this;
-}
-
-template <class Duration, class TimeZonePtr>
-inline
-zoned_time<Duration, TimeZonePtr>&
-zoned_time<Duration, TimeZonePtr>::operator=(const local_time<Duration>& ut)
-{
-    tp_ = zone_->to_sys(ut);
-    return *this;
-}
-
-template <class Duration, class TimeZonePtr>
-inline
-zoned_time<Duration, TimeZonePtr>::operator local_time<typename zoned_time<Duration, TimeZonePtr>::duration>() const
-{
-    return get_local_time();
-}
-
-template <class Duration, class TimeZonePtr>
-inline
-zoned_time<Duration, TimeZonePtr>::operator sys_time<typename zoned_time<Duration, TimeZonePtr>::duration>() const
-{
-    return get_sys_time();
-}
-
-template <class Duration, class TimeZonePtr>
-inline
-TimeZonePtr
-zoned_time<Duration, TimeZonePtr>::get_time_zone() const
-{
-    return zone_;
-}
-
-template <class Duration, class TimeZonePtr>
-inline
-local_time<typename zoned_time<Duration, TimeZonePtr>::duration>
-zoned_time<Duration, TimeZonePtr>::get_local_time() const
-{
-    return zone_->to_local(tp_);
-}
-
-template <class Duration, class TimeZonePtr>
-inline
-sys_time<typename zoned_time<Duration, TimeZonePtr>::duration>
-zoned_time<Duration, TimeZonePtr>::get_sys_time() const
-{
-    return tp_;
-}
-
-template <class Duration, class TimeZonePtr>
-inline
-sys_info
-zoned_time<Duration, TimeZonePtr>::get_info() const
-{
-    return zone_->get_info(tp_);
-}
-
-// make_zoned_time
-
-inline
-zoned_time<std::chrono::seconds>
-make_zoned()
-{
-    return zoned_time<std::chrono::seconds>();
-}
-
-template <class Duration>
-inline
-zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-make_zoned(const sys_time<Duration>& tp)
-{
-    return zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type>(tp);
-}
-
-template <class TimeZonePtr
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-#if !defined(__INTEL_COMPILER) || (__INTEL_COMPILER > 1600)
-          , class = typename std::enable_if
-          <
-            std::is_class
-            <
-                typename std::decay
-                <
-                    decltype(*detail::to_raw_pointer(std::declval<TimeZonePtr&>()))
-                >::type
-            >{}
-          >::type
-#endif
-#endif
-         >
-inline
-zoned_time<std::chrono::seconds, TimeZonePtr>
-make_zoned(TimeZonePtr z)
-{
-    return zoned_time<std::chrono::seconds, TimeZonePtr>(std::move(z));
-}
-
-inline
-zoned_seconds
-make_zoned(const std::string& name)
-{
-    return zoned_seconds(name);
-}
-
-template <class Duration, class TimeZonePtr
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-#if !defined(__INTEL_COMPILER) || (__INTEL_COMPILER > 1600)
-          , class = typename std::enable_if
-          <
-            std::is_class<typename std::decay<decltype(*std::declval<TimeZonePtr&>())>::type>{}
-          >::type
-#endif
-#endif
-         >
-inline
-zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type, TimeZonePtr>
-make_zoned(TimeZonePtr zone, const local_time<Duration>& tp)
-{
-    return zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type,
-                      TimeZonePtr>(std::move(zone), tp);
-}
-
-template <class Duration, class TimeZonePtr
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-#if !defined(__INTEL_COMPILER) || (__INTEL_COMPILER > 1600)
-          , class = typename std::enable_if
-          <
-            std::is_class<typename std::decay<decltype(*std::declval<TimeZonePtr&>())>::type>{}
-          >::type
-#endif
-#endif
-         >
-inline
-zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type, TimeZonePtr>
-make_zoned(TimeZonePtr zone, const local_time<Duration>& tp, choose c)
-{
-    return zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type,
-                      TimeZonePtr>(std::move(zone), tp, c);
-}
-
-template <class Duration>
-inline
-zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-make_zoned(const std::string& name, const local_time<Duration>& tp)
-{
-    return zoned_time<typename std::common_type<Duration,
-                      std::chrono::seconds>::type>(name, tp);
-}
-
-template <class Duration>
-inline
-zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-make_zoned(const std::string& name, const local_time<Duration>& tp, choose c)
-{
-    return zoned_time<typename std::common_type<Duration,
-                      std::chrono::seconds>::type>(name, tp, c);
-}
-
-template <class Duration, class TimeZonePtr>
-inline
-zoned_time<Duration, TimeZonePtr>
-make_zoned(TimeZonePtr zone, const zoned_time<Duration, TimeZonePtr>& zt)
-{
-    return zoned_time<Duration, TimeZonePtr>(std::move(zone), zt);
-}
-
-template <class Duration, class TimeZonePtr>
-inline
-zoned_time<Duration, TimeZonePtr>
-make_zoned(const std::string& name, const zoned_time<Duration, TimeZonePtr>& zt)
-{
-    return zoned_time<Duration, TimeZonePtr>(name, zt);
-}
-
-template <class Duration, class TimeZonePtr>
-inline
-zoned_time<Duration, TimeZonePtr>
-make_zoned(TimeZonePtr zone, const zoned_time<Duration, TimeZonePtr>& zt, choose c)
-{
-    return zoned_time<Duration, TimeZonePtr>(std::move(zone), zt, c);
-}
-
-template <class Duration, class TimeZonePtr>
-inline
-zoned_time<Duration, TimeZonePtr>
-make_zoned(const std::string& name, const zoned_time<Duration, TimeZonePtr>& zt, choose c)
-{
-    return zoned_time<Duration, TimeZonePtr>(name, zt, c);
-}
-
-template <class Duration, class TimeZonePtr
-#if !defined(_MSC_VER) || (_MSC_VER > 1916)
-#if !defined(__INTEL_COMPILER) || (__INTEL_COMPILER > 1600)
-          , class = typename std::enable_if
-          <
-            std::is_class<typename std::decay<decltype(*std::declval<TimeZonePtr&>())>::type>{}
-          >::type
-#endif
-#endif
-         >
-inline
-zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type, TimeZonePtr>
-make_zoned(TimeZonePtr zone, const sys_time<Duration>& st)
-{
-    return zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type,
-                      TimeZonePtr>(std::move(zone), st);
-}
-
-template <class Duration>
-inline
-zoned_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-make_zoned(const std::string& name, const sys_time<Duration>& st)
-{
-    return zoned_time<typename std::common_type<Duration,
-                      std::chrono::seconds>::type>(name, st);
-}
-
-template <class CharT, class Traits, class Duration, class TimeZonePtr>
-std::basic_ostream<CharT, Traits>&
-to_stream(std::basic_ostream<CharT, Traits>& os, const CharT* fmt,
-          const zoned_time<Duration, TimeZonePtr>& tp)
-{
-    using duration = typename zoned_time<Duration, TimeZonePtr>::duration;
-    using LT = local_time<duration>;
-    auto const st = tp.get_sys_time();
-    auto const info = tp.get_time_zone()->get_info(st);
-    return to_stream(os, fmt, LT{(st+info.offset).time_since_epoch()},
-                     &info.abbrev, &info.offset);
-}
-
-template <class CharT, class Traits, class Duration, class TimeZonePtr>
-inline
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const zoned_time<Duration, TimeZonePtr>& t)
-{
-    const CharT fmt[] = {'%', 'F', ' ', '%', 'T', ' ', '%', 'Z', CharT{}};
-    return to_stream(os, fmt, t);
-}
-
-#if !MISSING_LEAP_SECONDS
-
-class utc_clock
-{
-public:
-    using duration                  = std::chrono::system_clock::duration;
-    using rep                       = duration::rep;
-    using period                    = duration::period;
-    using time_point                = std::chrono::time_point<utc_clock>;
-    static CONSTDATA bool is_steady = false;
-
-    static time_point now();
-
-    template<typename Duration>
-    static
-    std::chrono::time_point<std::chrono::system_clock, typename std::common_type<Duration, std::chrono::seconds>::type>
-    to_sys(const std::chrono::time_point<utc_clock, Duration>&);
-
-    template<typename Duration>
-    static
-    std::chrono::time_point<utc_clock, typename std::common_type<Duration, std::chrono::seconds>::type>
-    from_sys(const std::chrono::time_point<std::chrono::system_clock, Duration>&);
-
-    template<typename Duration>
-    static
-    std::chrono::time_point<local_t, typename std::common_type<Duration, std::chrono::seconds>::type>
-    to_local(const std::chrono::time_point<utc_clock, Duration>&);
-
-    template<typename Duration>
-    static
-    std::chrono::time_point<utc_clock, typename std::common_type<Duration, std::chrono::seconds>::type>
-    from_local(const std::chrono::time_point<local_t, Duration>&);
-};
-
-template <class Duration>
-    using utc_time = std::chrono::time_point<utc_clock, Duration>;
-
-using utc_seconds = utc_time<std::chrono::seconds>;
-
-template <class Duration>
-utc_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-utc_clock::from_sys(const sys_time<Duration>& st)
-{
-    using std::chrono::seconds;
-    using CD = typename std::common_type<Duration, seconds>::type;
-    auto const& leaps = get_tzdb().leap_seconds;
-    auto const lt = std::upper_bound(leaps.begin(), leaps.end(), st);
-    return utc_time<CD>{st.time_since_epoch() + seconds{lt-leaps.begin()}};
-}
-
-// Return pair<is_leap_second, seconds{number_of_leap_seconds_since_1970}>
-// first is true if ut is during a leap second insertion, otherwise false.
-// If ut is during a leap second insertion, that leap second is included in the count
-template <class Duration>
-std::pair<bool, std::chrono::seconds>
-is_leap_second(date::utc_time<Duration> const& ut)
-{
-    using std::chrono::seconds;
-    using duration = typename std::common_type<Duration, seconds>::type;
-    auto const& leaps = get_tzdb().leap_seconds;
-    auto tp = sys_time<duration>{ut.time_since_epoch()};
-    auto const lt = std::upper_bound(leaps.begin(), leaps.end(), tp);
-    auto ds = seconds{lt-leaps.begin()};
-    tp -= ds;
-    auto ls = false;
-    if (lt > leaps.begin())
-    {
-        if (tp < lt[-1])
-        {
-            if (tp >= lt[-1].date() - seconds{1})
-                ls = true;
-            else
-                --ds;
-        }
-    }
-    return {ls, ds};
-}
-
-struct leap_second_info
-{
-    bool is_leap_second;
-    std::chrono::seconds elapsed;
-};
-
-template <class Duration>
-leap_second_info
-get_leap_second_info(date::utc_time<Duration> const& ut)
-{
-    auto p = is_leap_second(ut);
-    return {p.first, p.second};
-}
-
-template <class Duration>
-sys_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-utc_clock::to_sys(const utc_time<Duration>& ut)
-{
-    using std::chrono::seconds;
-    using CD = typename std::common_type<Duration, seconds>::type;
-    auto ls = is_leap_second(ut);
-    auto tp = sys_time<CD>{ut.time_since_epoch() - ls.second};
-    if (ls.first)
-        tp = floor<seconds>(tp) + seconds{1} - CD{1};
-    return tp;
-}
-
-inline
-utc_clock::time_point
-utc_clock::now()
-{
-    return from_sys(std::chrono::system_clock::now());
-}
-
-template <class Duration>
-utc_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-utc_clock::from_local(const local_time<Duration>& st)
-{
-    return from_sys(sys_time<Duration>{st.time_since_epoch()});
-}
-
-template <class Duration>
-local_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-utc_clock::to_local(const utc_time<Duration>& ut)
-{
-    using CD = typename std::common_type<Duration, std::chrono::seconds>::type;
-    return local_time<CD>{to_sys(ut).time_since_epoch()};
-}
-
-template <class CharT, class Traits, class Duration>
-std::basic_ostream<CharT, Traits>&
-to_stream(std::basic_ostream<CharT, Traits>& os, const CharT* fmt,
-          const utc_time<Duration>& t)
-{
-    using std::chrono::seconds;
-    using CT = typename std::common_type<Duration, seconds>::type;
-    const std::string abbrev("UTC");
-    CONSTDATA seconds offset{0};
-    auto ls = is_leap_second(t);
-    auto tp = sys_time<CT>{t.time_since_epoch() - ls.second};
-    auto const sd = floor<days>(tp);
-    year_month_day ymd = sd;
-    auto time = make_time(tp - sys_seconds{sd});
-    time.seconds(detail::undocumented{}) += seconds{ls.first};
-    fields<CT> fds{ymd, time};
-    return to_stream(os, fmt, fds, &abbrev, &offset);
-}
-
-template <class CharT, class Traits, class Duration>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const utc_time<Duration>& t)
-{
-    const CharT fmt[] = {'%', 'F', ' ', '%', 'T', CharT{}};
-    return to_stream(os, fmt, t);
-}
-
-template <class Duration, class CharT, class Traits, class Alloc = std::allocator<CharT>>
-std::basic_istream<CharT, Traits>&
-from_stream(std::basic_istream<CharT, Traits>& is, const CharT* fmt,
-            utc_time<Duration>& tp, std::basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
-            std::chrono::minutes* offset = nullptr)
-{
-    using std::chrono::seconds;
-    using std::chrono::minutes;
-    using CT = typename std::common_type<Duration, seconds>::type;
-    minutes offset_local{};
-    auto offptr = offset ? offset : &offset_local;
-    fields<CT> fds{};
-    fds.has_tod = true;
-    from_stream(is, fmt, fds, abbrev, offptr);
-    if (!fds.ymd.ok())
-        is.setstate(std::ios::failbit);
-    if (!is.fail())
-    {
-        bool is_60_sec = fds.tod.seconds() == seconds{60};
-        if (is_60_sec)
-            fds.tod.seconds(detail::undocumented{}) -= seconds{1};
-        auto tmp = utc_clock::from_sys(sys_days(fds.ymd) - *offptr + fds.tod.to_duration());
-        if (is_60_sec)
-            tmp += seconds{1};
-        if (is_60_sec != is_leap_second(tmp).first || !fds.tod.in_conventional_range())
-        {
-            is.setstate(std::ios::failbit);
-            return is;
-        }
-        tp = std::chrono::time_point_cast<Duration>(tmp);
-    }
-    return is;
-}
-
-// tai_clock
-
-class tai_clock
-{
-public:
-    using duration                  = std::chrono::system_clock::duration;
-    using rep                       = duration::rep;
-    using period                    = duration::period;
-    using time_point                = std::chrono::time_point<tai_clock>;
-    static const bool is_steady     = false;
-
-    static time_point now();
-
-    template<typename Duration>
-    static
-    std::chrono::time_point<utc_clock, typename std::common_type<Duration, std::chrono::seconds>::type>
-    to_utc(const std::chrono::time_point<tai_clock, Duration>&) NOEXCEPT;
-
-    template<typename Duration>
-    static
-    std::chrono::time_point<tai_clock, typename std::common_type<Duration, std::chrono::seconds>::type>
-    from_utc(const std::chrono::time_point<utc_clock, Duration>&) NOEXCEPT;
-
-    template<typename Duration>
-    static
-    std::chrono::time_point<local_t, typename std::common_type<Duration, date::days>::type>
-    to_local(const std::chrono::time_point<tai_clock, Duration>&) NOEXCEPT;
-
-    template<typename Duration>
-    static
-    std::chrono::time_point<tai_clock, typename std::common_type<Duration, date::days>::type>
-    from_local(const std::chrono::time_point<local_t, Duration>&) NOEXCEPT;
-};
-
-template <class Duration>
-    using tai_time = std::chrono::time_point<tai_clock, Duration>;
-
-using tai_seconds = tai_time<std::chrono::seconds>;
-
-template <class Duration>
-inline
-utc_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-tai_clock::to_utc(const tai_time<Duration>& t) NOEXCEPT
-{
-    using std::chrono::seconds;
-    using CD = typename std::common_type<Duration, seconds>::type;
-    return utc_time<CD>{t.time_since_epoch()} -
-            (sys_days(year{1970}/January/1) - sys_days(year{1958}/January/1) + seconds{10});
-}
-
-template <class Duration>
-inline
-tai_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-tai_clock::from_utc(const utc_time<Duration>& t) NOEXCEPT
-{
-    using std::chrono::seconds;
-    using CD = typename std::common_type<Duration, seconds>::type;
-    return tai_time<CD>{t.time_since_epoch()} +
-            (sys_days(year{1970}/January/1) - sys_days(year{1958}/January/1) + seconds{10});
-}
-
-inline
-tai_clock::time_point
-tai_clock::now()
-{
-    return from_utc(utc_clock::now());
-}
-
-template <class Duration>
-inline
-local_time<typename std::common_type<Duration, date::days>::type>
-tai_clock::to_local(const tai_time<Duration>& t) NOEXCEPT
-{
-    using CD = typename std::common_type<Duration, date::days>::type;
-    return local_time<CD>{t.time_since_epoch()} -
-           (local_days(year{1970}/January/1) - local_days(year{1958}/January/1));
-}
-
-template <class Duration>
-inline
-tai_time<typename std::common_type<Duration, date::days>::type>
-tai_clock::from_local(const local_time<Duration>& t) NOEXCEPT
-{
-    using CD = typename std::common_type<Duration, date::days>::type;
-    return tai_time<CD>{t.time_since_epoch()} +
-            (local_days(year{1970}/January/1) - local_days(year{1958}/January/1));
-}
-
-template <class CharT, class Traits, class Duration>
-std::basic_ostream<CharT, Traits>&
-to_stream(std::basic_ostream<CharT, Traits>& os, const CharT* fmt,
-          const tai_time<Duration>& t)
-{
-    const std::string abbrev("TAI");
-    CONSTDATA std::chrono::seconds offset{0};
-    return to_stream(os, fmt, tai_clock::to_local(t), &abbrev, &offset);
-}
-
-template <class CharT, class Traits, class Duration>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const tai_time<Duration>& t)
-{
-    const CharT fmt[] = {'%', 'F', ' ', '%', 'T', CharT{}};
-    return to_stream(os, fmt, t);
-}
-
-template <class Duration, class CharT, class Traits, class Alloc = std::allocator<CharT>>
-std::basic_istream<CharT, Traits>&
-from_stream(std::basic_istream<CharT, Traits>& is, const CharT* fmt,
-            tai_time<Duration>& tp,
-            std::basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
-            std::chrono::minutes* offset = nullptr)
-{
-    local_time<Duration> lp;
-    from_stream(is, fmt, lp, abbrev, offset);
-    if (!is.fail())
-        tp = tai_clock::from_local(lp);
-    return is;
-}
-
-// gps_clock
-
-class gps_clock
-{
-public:
-    using duration                  = std::chrono::system_clock::duration;
-    using rep                       = duration::rep;
-    using period                    = duration::period;
-    using time_point                = std::chrono::time_point<gps_clock>;
-    static const bool is_steady     = false;
-
-    static time_point now();
-
-    template<typename Duration>
-    static
-    std::chrono::time_point<utc_clock, typename std::common_type<Duration, std::chrono::seconds>::type>
-    to_utc(const std::chrono::time_point<gps_clock, Duration>&) NOEXCEPT;
-
-    template<typename Duration>
-    static
-    std::chrono::time_point<gps_clock, typename std::common_type<Duration, std::chrono::seconds>::type>
-    from_utc(const std::chrono::time_point<utc_clock, Duration>&) NOEXCEPT;
-
-    template<typename Duration>
-    static
-    std::chrono::time_point<local_t, typename std::common_type<Duration, date::days>::type>
-    to_local(const std::chrono::time_point<gps_clock, Duration>&) NOEXCEPT;
-
-    template<typename Duration>
-    static
-    std::chrono::time_point<gps_clock, typename std::common_type<Duration, date::days>::type>
-    from_local(const std::chrono::time_point<local_t, Duration>&) NOEXCEPT;
-};
-
-template <class Duration>
-    using gps_time = std::chrono::time_point<gps_clock, Duration>;
-
-using gps_seconds = gps_time<std::chrono::seconds>;
-
-template <class Duration>
-inline
-utc_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-gps_clock::to_utc(const gps_time<Duration>& t) NOEXCEPT
-{
-    using std::chrono::seconds;
-    using CD = typename std::common_type<Duration, seconds>::type;
-    return utc_time<CD>{t.time_since_epoch()} +
-            (sys_days(year{1980}/January/Sunday[1]) - sys_days(year{1970}/January/1) +
-             seconds{9});
-}
-
-template <class Duration>
-inline
-gps_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-gps_clock::from_utc(const utc_time<Duration>& t) NOEXCEPT
-{
-    using std::chrono::seconds;
-    using CD = typename std::common_type<Duration, seconds>::type;
-    return gps_time<CD>{t.time_since_epoch()} -
-            (sys_days(year{1980}/January/Sunday[1]) - sys_days(year{1970}/January/1) +
-             seconds{9});
-}
-
-inline
-gps_clock::time_point
-gps_clock::now()
-{
-    return from_utc(utc_clock::now());
-}
-
-template <class Duration>
-inline
-local_time<typename std::common_type<Duration, date::days>::type>
-gps_clock::to_local(const gps_time<Duration>& t) NOEXCEPT
-{
-    using CD = typename std::common_type<Duration, date::days>::type;
-    return local_time<CD>{t.time_since_epoch()} +
-            (local_days(year{1980}/January/Sunday[1]) - local_days(year{1970}/January/1));
-}
-
-template <class Duration>
-inline
-gps_time<typename std::common_type<Duration, date::days>::type>
-gps_clock::from_local(const local_time<Duration>& t) NOEXCEPT
-{
-    using CD = typename std::common_type<Duration, date::days>::type;
-    return gps_time<CD>{t.time_since_epoch()} -
-            (local_days(year{1980}/January/Sunday[1]) - local_days(year{1970}/January/1));
-}
-
-
-template <class CharT, class Traits, class Duration>
-std::basic_ostream<CharT, Traits>&
-to_stream(std::basic_ostream<CharT, Traits>& os, const CharT* fmt,
-          const gps_time<Duration>& t)
-{
-    const std::string abbrev("GPS");
-    CONSTDATA std::chrono::seconds offset{0};
-    return to_stream(os, fmt, gps_clock::to_local(t), &abbrev, &offset);
-}
-
-template <class CharT, class Traits, class Duration>
-std::basic_ostream<CharT, Traits>&
-operator<<(std::basic_ostream<CharT, Traits>& os, const gps_time<Duration>& t)
-{
-    const CharT fmt[] = {'%', 'F', ' ', '%', 'T', CharT{}};
-    return to_stream(os, fmt, t);
-}
-
-template <class Duration, class CharT, class Traits, class Alloc = std::allocator<CharT>>
-std::basic_istream<CharT, Traits>&
-from_stream(std::basic_istream<CharT, Traits>& is, const CharT* fmt,
-            gps_time<Duration>& tp,
-            std::basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
-            std::chrono::minutes* offset = nullptr)
-{
-    local_time<Duration> lp;
-    from_stream(is, fmt, lp, abbrev, offset);
-    if (!is.fail())
-        tp = gps_clock::from_local(lp);
-    return is;
-}
-
-// clock_time_conversion
-
-template <class DstClock, class SrcClock>
-struct clock_time_conversion
-{};
-
-template <>
-struct clock_time_conversion<std::chrono::system_clock, std::chrono::system_clock>
-{
-    template <class Duration>
-    sys_time<Duration>
-    operator()(const sys_time<Duration>& st) const
-    {
-        return st;
-    }
-};
-
-template <>
-struct clock_time_conversion<utc_clock, utc_clock>
-{
-    template <class Duration>
-    utc_time<Duration>
-    operator()(const utc_time<Duration>& ut) const
-    {
-        return ut;
-    }
-};
-
-template<>
-struct clock_time_conversion<local_t, local_t>
-{
-    template <class Duration>
-    local_time<Duration>
-    operator()(const local_time<Duration>& lt) const
-    {
-        return lt;
-    }
-};
-
-template <>
-struct clock_time_conversion<utc_clock, std::chrono::system_clock>
-{
-    template <class Duration>
-    utc_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-    operator()(const sys_time<Duration>& st) const
-    {
-        return utc_clock::from_sys(st);
-    }
-};
-
-template <>
-struct clock_time_conversion<std::chrono::system_clock, utc_clock>
-{
-    template <class Duration>
-    sys_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-    operator()(const utc_time<Duration>& ut) const
-    {
-        return utc_clock::to_sys(ut);
-    }
-};
-
-template<>
-struct clock_time_conversion<local_t, std::chrono::system_clock>
-{
-    template <class Duration>
-    local_time<Duration>
-    operator()(const sys_time<Duration>& st) const
-    {
-       return local_time<Duration>{st.time_since_epoch()};
-    }
-};
-
-template<>
-struct clock_time_conversion<std::chrono::system_clock, local_t>
-{
-    template <class Duration>
-    sys_time<Duration>
-    operator()(const local_time<Duration>& lt) const
-    {
-        return sys_time<Duration>{lt.time_since_epoch()};
-    }
-};
-
-template<>
-struct clock_time_conversion<utc_clock, local_t>
-{
-    template <class Duration>
-    utc_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-    operator()(const local_time<Duration>& lt) const
-    {
-       return utc_clock::from_local(lt);
-    }
-};
-
-template<>
-struct clock_time_conversion<local_t, utc_clock>
-{
-    template <class Duration>
-    local_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-    operator()(const utc_time<Duration>& ut) const
-    {
-       return utc_clock::to_local(ut);
-    }
-};
-
-template<typename Clock>
-struct clock_time_conversion<Clock, Clock>
-{
-    template <class Duration>
-    std::chrono::time_point<Clock, Duration>
-    operator()(const std::chrono::time_point<Clock, Duration>& tp) const
-    {
-        return tp;
-    }
-};
-
-namespace ctc_detail
-{
-
-template <class Clock, class Duration>
-    using time_point = std::chrono::time_point<Clock, Duration>;
-
-using std::declval;
-using std::chrono::system_clock;
-
-//Check if TimePoint is time for given clock,
-//if not emits hard error
-template <class Clock, class TimePoint>
-struct return_clock_time
-{
-    using clock_time_point = time_point<Clock, typename TimePoint::duration>;
-    using type             = TimePoint;
-
-    static_assert(std::is_same<TimePoint, clock_time_point>::value,
-                  "time point with appropariate clock shall be returned");
-};
-
-// Check if Clock has to_sys method accepting TimePoint with given duration const& and
-// returning sys_time. If so has nested type member equal to return type to_sys.
-template <class Clock, class Duration, class = void>
-struct return_to_sys
-{};
-
-template <class Clock, class Duration>
-struct return_to_sys
-       <
-           Clock, Duration,
-           decltype(Clock::to_sys(declval<time_point<Clock, Duration> const&>()), void())
-       >
-    : return_clock_time
-      <
-          system_clock,
-          decltype(Clock::to_sys(declval<time_point<Clock, Duration> const&>()))
-      >
-{};
-
-// Similiar to above
-template <class Clock, class Duration, class = void>
-struct return_from_sys
-{};
-
-template <class Clock, class Duration>
-struct return_from_sys
-       <
-           Clock, Duration,
-           decltype(Clock::from_sys(declval<time_point<system_clock, Duration> const&>()),
-                    void())
-       >
-    : return_clock_time
-      <
-          Clock,
-          decltype(Clock::from_sys(declval<time_point<system_clock, Duration> const&>()))
-      >
-{};
-
-// Similiar to above
-template <class Clock, class Duration, class = void>
-struct return_to_utc
-{};
-
-template <class Clock, class Duration>
-struct return_to_utc
-       <
-           Clock, Duration,
-           decltype(Clock::to_utc(declval<time_point<Clock, Duration> const&>()), void())
-       >
-    : return_clock_time
-      <
-          utc_clock,
-          decltype(Clock::to_utc(declval<time_point<Clock, Duration> const&>()))>
-{};
-
-// Similiar to above
-template <class Clock, class Duration, class = void>
-struct return_from_utc
-{};
-
-template <class Clock, class Duration>
-struct return_from_utc
-       <
-           Clock, Duration,
-           decltype(Clock::from_utc(declval<time_point<utc_clock, Duration> const&>()),
-                    void())
-       >
-    : return_clock_time
-      <
-          Clock,
-          decltype(Clock::from_utc(declval<time_point<utc_clock, Duration> const&>()))
-      >
-{};
-
-// Similiar to above
-template<typename Clock, typename Duration, typename = void>
-struct return_to_local
-{};
-
-template<typename Clock, typename Duration>
-struct return_to_local
-       <
-          Clock, Duration,
-          decltype(Clock::to_local(declval<time_point<Clock, Duration> const&>()),
-                   void())
-       >
-     : return_clock_time
-       <
-           local_t,
-           decltype(Clock::to_local(declval<time_point<Clock, Duration> const&>()))
-       >
-{};
-
-// Similiar to above
-template<typename Clock, typename Duration, typename = void>
-struct return_from_local
-{};
-
-template<typename Clock, typename Duration>
-struct return_from_local
-       <
-           Clock, Duration,
-           decltype(Clock::from_local(declval<time_point<local_t, Duration> const&>()),
-                    void())
-       >
-     : return_clock_time
-       <
-           Clock,
-           decltype(Clock::from_local(declval<time_point<local_t, Duration> const&>()))
-       >
-{};
-
-}  // namespace ctc_detail
-
-template <class SrcClock>
-struct clock_time_conversion<std::chrono::system_clock, SrcClock>
-{
-    template <class Duration>
-    typename ctc_detail::return_to_sys<SrcClock, Duration>::type
-    operator()(const std::chrono::time_point<SrcClock, Duration>& tp) const
-    {
-        return SrcClock::to_sys(tp);
-    }
-};
-
-template <class DstClock>
-struct clock_time_conversion<DstClock, std::chrono::system_clock>
-{
-    template <class Duration>
-    typename ctc_detail::return_from_sys<DstClock, Duration>::type
-    operator()(const sys_time<Duration>& st) const
-    {
-        return DstClock::from_sys(st);
-    }
-};
-
-template <class SrcClock>
-struct clock_time_conversion<utc_clock, SrcClock>
-{
-    template <class Duration>
-    typename ctc_detail::return_to_utc<SrcClock, Duration>::type
-    operator()(const std::chrono::time_point<SrcClock, Duration>& tp) const
-    {
-        return SrcClock::to_utc(tp);
-    }
-};
-
-template <class DstClock>
-struct clock_time_conversion<DstClock, utc_clock>
-{
-    template <class Duration>
-    typename ctc_detail::return_from_utc<DstClock, Duration>::type
-    operator()(const utc_time<Duration>& ut) const
-    {
-        return DstClock::from_utc(ut);
-    }
-};
-
-template<typename SrcClock>
-struct clock_time_conversion<local_t, SrcClock>
-{
-    template <class Duration>
-    typename ctc_detail::return_to_local<SrcClock, Duration>::type
-    operator()(const std::chrono::time_point<SrcClock, Duration>& tp) const
-    {
-        return SrcClock::to_local(tp);
-    }
-};
-
-template<typename DstClock>
-struct clock_time_conversion<DstClock, local_t>
-{
-    template <class Duration>
-    typename ctc_detail::return_from_local<DstClock, Duration>::type
-    operator()(const local_time<Duration>& lt) const
-    {
-        return DstClock::from_local(lt);
-    }
-};
-
-namespace clock_cast_detail
-{
-
-template <class Clock, class Duration>
-    using time_point = std::chrono::time_point<Clock, Duration>;
-using std::chrono::system_clock;
-
-template <class DstClock, class SrcClock, class Duration>
-auto
-conv_clock(const time_point<SrcClock, Duration>& t)
-    -> decltype(std::declval<clock_time_conversion<DstClock, SrcClock>>()(t))
-{
-    return clock_time_conversion<DstClock, SrcClock>{}(t);
-}
-
-//direct trait conversion, 1st candidate
-template <class DstClock, class SrcClock, class Duration>
-auto
-cc_impl(const time_point<SrcClock, Duration>& t, const time_point<SrcClock, Duration>*)
-    -> decltype(conv_clock<DstClock>(t))
-{
-    return conv_clock<DstClock>(t);
-}
-
-//conversion through sys, 2nd candidate
-template <class DstClock, class SrcClock, class Duration>
-auto
-cc_impl(const time_point<SrcClock, Duration>& t, const void*)
-    -> decltype(conv_clock<DstClock>(conv_clock<system_clock>(t)))
-{
-    return conv_clock<DstClock>(conv_clock<system_clock>(t));
-}
-
-//conversion through utc, 2nd candidate
-template <class DstClock, class SrcClock, class Duration>
-auto
-cc_impl(const time_point<SrcClock, Duration>& t, const void*)
-    -> decltype(0,  // MSVC_WORKAROUND
-                conv_clock<DstClock>(conv_clock<utc_clock>(t)))
-{
-    return conv_clock<DstClock>(conv_clock<utc_clock>(t));
-}
-
-//conversion through sys and utc, 3rd candidate
-template <class DstClock, class SrcClock, class Duration>
-auto
-cc_impl(const time_point<SrcClock, Duration>& t, ...)
-    -> decltype(conv_clock<DstClock>(conv_clock<utc_clock>(conv_clock<system_clock>(t))))
-{
-    return conv_clock<DstClock>(conv_clock<utc_clock>(conv_clock<system_clock>(t)));
-}
-
-//conversion through utc and sys, 3rd candidate
-template <class DstClock, class SrcClock, class Duration>
-auto
-cc_impl(const time_point<SrcClock, Duration>& t, ...)
-    -> decltype(0,  // MSVC_WORKAROUND
-                conv_clock<DstClock>(conv_clock<system_clock>(conv_clock<utc_clock>(t))))
-{
-    return conv_clock<DstClock>(conv_clock<system_clock>(conv_clock<utc_clock>(t)));
-}
-
-}  // namespace clock_cast_detail
-
-template <class DstClock, class SrcClock, class Duration>
-auto
-clock_cast(const std::chrono::time_point<SrcClock, Duration>& tp)
-    -> decltype(clock_cast_detail::cc_impl<DstClock>(tp, &tp))
-{
-    return clock_cast_detail::cc_impl<DstClock>(tp, &tp);
-}
-
-// Deprecated API
-
-template <class Duration>
-inline
-sys_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-to_sys_time(const utc_time<Duration>& t)
-{
-    return utc_clock::to_sys(t);
-}
-
-template <class Duration>
-inline
-sys_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-to_sys_time(const tai_time<Duration>& t)
-{
-    return utc_clock::to_sys(tai_clock::to_utc(t));
-}
-
-template <class Duration>
-inline
-sys_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-to_sys_time(const gps_time<Duration>& t)
-{
-    return utc_clock::to_sys(gps_clock::to_utc(t));
-}
-
-
-template <class Duration>
-inline
-utc_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-to_utc_time(const sys_time<Duration>& t)
-{
-    return utc_clock::from_sys(t);
-}
-
-template <class Duration>
-inline
-utc_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-to_utc_time(const tai_time<Duration>& t)
-{
-    return tai_clock::to_utc(t);
-}
-
-template <class Duration>
-inline
-utc_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-to_utc_time(const gps_time<Duration>& t)
-{
-    return gps_clock::to_utc(t);
-}
-
-
-template <class Duration>
-inline
-tai_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-to_tai_time(const sys_time<Duration>& t)
-{
-    return tai_clock::from_utc(utc_clock::from_sys(t));
-}
-
-template <class Duration>
-inline
-tai_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-to_tai_time(const utc_time<Duration>& t)
-{
-    return tai_clock::from_utc(t);
-}
-
-template <class Duration>
-inline
-tai_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-to_tai_time(const gps_time<Duration>& t)
-{
-    return tai_clock::from_utc(gps_clock::to_utc(t));
-}
-
-
-template <class Duration>
-inline
-gps_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-to_gps_time(const sys_time<Duration>& t)
-{
-    return gps_clock::from_utc(utc_clock::from_sys(t));
-}
-
-template <class Duration>
-inline
-gps_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-to_gps_time(const utc_time<Duration>& t)
-{
-    return gps_clock::from_utc(t);
-}
-
-template <class Duration>
-inline
-gps_time<typename std::common_type<Duration, std::chrono::seconds>::type>
-to_gps_time(const tai_time<Duration>& t)
-{
-    return gps_clock::from_utc(tai_clock::to_utc(t));
-}
-
-#endif  // !MISSING_LEAP_SECONDS
-
-}  // namespace date
-
-#endif  // TZ_H




diff --git a/src/libs/date/includes/date/tz_private.h b/src/libs/date/includes/date/tz_private.h
deleted file mode 100644
index 798fcf5ad1750d4034a5c3be895faeea362b438b..0000000000000000000000000000000000000000
--- a/src/libs/date/includes/date/tz_private.h
+++ /dev/null
@@ -1,316 +0,0 @@
-#ifndef TZ_PRIVATE_H
-#define TZ_PRIVATE_H
-
-// The MIT License (MIT)
-//
-// Copyright (c) 2015, 2016 Howard Hinnant
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-//
-// Our apologies.  When the previous paragraph was written, lowercase had not yet
-// been invented (that would involve another several millennia of evolution).
-// We did not mean to shout.
-
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
-#include "tz.h"
-#else
-#include "date.h"
-#include <vector>
-#endif
-
-namespace date
-{
-
-namespace detail
-{
-
-#if !USE_OS_TZDB
-
-enum class tz {utc, local, standard};
-
-//forward declare to avoid warnings in gcc 6.2
-class MonthDayTime;
-std::istream& operator>>(std::istream& is, MonthDayTime& x);
-std::ostream& operator<<(std::ostream& os, const MonthDayTime& x);
-
-
-class MonthDayTime
-{
-private:
-    struct pair
-    {
-#if defined(_MSC_VER) && (_MSC_VER < 1900)
-        pair() : month_day_(date::jan / 1), weekday_(0U) {}
-
-        pair(const date::month_day& month_day, const date::weekday& weekday)
-            : month_day_(month_day), weekday_(weekday) {}
-#endif
-
-        date::month_day month_day_;
-        date::weekday   weekday_;
-    };
-
-    enum Type {month_day, month_last_dow, lteq, gteq};
-
-    Type                         type_{month_day};
-
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
-    union U
-#else
-    struct U
-#endif
-    {
-        date::month_day          month_day_;
-        date::month_weekday_last month_weekday_last_;
-        pair                     month_day_weekday_;
-
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
-        U() : month_day_{date::jan/1} {}
-#else
-        U() :
-            month_day_(date::jan/1),
-            month_weekday_last_(date::month(0U), date::weekday_last(date::weekday(0U)))
-        {}
-
-#endif // !defined(_MSC_VER) || (_MSC_VER >= 1900)
-
-        U& operator=(const date::month_day& x);
-        U& operator=(const date::month_weekday_last& x);
-        U& operator=(const pair& x);
-    } u;
-
-    std::chrono::hours           h_{};
-    std::chrono::minutes         m_{};
-    std::chrono::seconds         s_{};
-    tz                           zone_{tz::local};
-
-public:
-    MonthDayTime() = default;
-    MonthDayTime(local_seconds tp, tz timezone);
-    MonthDayTime(const date::month_day& md, tz timezone);
-
-    date::day day() const;
-    date::month month() const;
-    tz zone() const {return zone_;}
-
-    void canonicalize(date::year y);
-
-    sys_seconds
-       to_sys(date::year y, std::chrono::seconds offset, std::chrono::seconds save) const;
-    sys_days to_sys_days(date::year y) const;
-
-    sys_seconds to_time_point(date::year y) const;
-    int compare(date::year y, const MonthDayTime& x, date::year yx,
-                std::chrono::seconds offset, std::chrono::minutes prev_save) const;
-
-    friend std::istream& operator>>(std::istream& is, MonthDayTime& x);
-    friend std::ostream& operator<<(std::ostream& os, const MonthDayTime& x);
-};
-
-// A Rule specifies one or more set of datetimes without using an offset.
-// Multiple dates are specified with multiple years.  The years in effect
-// go from starting_year_ to ending_year_, inclusive.  starting_year_ <=
-// ending_year_. save_ is in effect for times from the specified time
-// onward, including the specified time. When the specified time is
-// local, it uses the save_ from the chronologically previous Rule, or if
-// there is none, 0.
-
-//forward declare to avoid warnings in gcc 6.2
-class Rule;
-bool operator==(const Rule& x, const Rule& y);
-bool operator<(const Rule& x, const Rule& y);
-bool operator==(const Rule& x, const date::year& y);
-bool operator<(const Rule& x, const date::year& y);
-bool operator==(const date::year& x, const Rule& y);
-bool operator<(const date::year& x, const Rule& y);
-bool operator==(const Rule& x, const std::string& y);
-bool operator<(const Rule& x, const std::string& y);
-bool operator==(const std::string& x, const Rule& y);
-bool operator<(const std::string& x, const Rule& y);
-std::ostream& operator<<(std::ostream& os, const Rule& r);
-
-class Rule
-{
-private:
-    std::string          name_;
-    date::year           starting_year_{0};
-    date::year           ending_year_{0};
-    MonthDayTime         starting_at_;
-    std::chrono::minutes save_{0};
-    std::string          abbrev_;
-
-public:
-    Rule() = default;
-    explicit Rule(const std::string& s);
-    Rule(const Rule& r, date::year starting_year, date::year ending_year);
-
-    const std::string& name() const {return name_;}
-    const std::string& abbrev() const {return abbrev_;}
-
-    const MonthDayTime&         mdt()           const {return starting_at_;}
-    const date::year&           starting_year() const {return starting_year_;}
-    const date::year&           ending_year()   const {return ending_year_;}
-    const std::chrono::minutes& save()          const {return save_;}
-
-    static void split_overlaps(std::vector<Rule>& rules);
-
-    friend bool operator==(const Rule& x, const Rule& y);
-    friend bool operator<(const Rule& x, const Rule& y);
-    friend bool operator==(const Rule& x, const date::year& y);
-    friend bool operator<(const Rule& x, const date::year& y);
-    friend bool operator==(const date::year& x, const Rule& y);
-    friend bool operator<(const date::year& x, const Rule& y);
-    friend bool operator==(const Rule& x, const std::string& y);
-    friend bool operator<(const Rule& x, const std::string& y);
-    friend bool operator==(const std::string& x, const Rule& y);
-    friend bool operator<(const std::string& x, const Rule& y);
-
-    friend std::ostream& operator<<(std::ostream& os, const Rule& r);
-
-private:
-    date::day day() const;
-    date::month month() const;
-    static void split_overlaps(std::vector<Rule>& rules, std::size_t i, std::size_t& e);
-    static bool overlaps(const Rule& x, const Rule& y);
-    static void split(std::vector<Rule>& rules, std::size_t i, std::size_t k,
-                      std::size_t& e);
-};
-
-inline bool operator!=(const Rule& x, const Rule& y) {return !(x == y);}
-inline bool operator> (const Rule& x, const Rule& y) {return   y < x;}
-inline bool operator<=(const Rule& x, const Rule& y) {return !(y < x);}
-inline bool operator>=(const Rule& x, const Rule& y) {return !(x < y);}
-
-inline bool operator!=(const Rule& x, const date::year& y) {return !(x == y);}
-inline bool operator> (const Rule& x, const date::year& y) {return   y < x;}
-inline bool operator<=(const Rule& x, const date::year& y) {return !(y < x);}
-inline bool operator>=(const Rule& x, const date::year& y) {return !(x < y);}
-
-inline bool operator!=(const date::year& x, const Rule& y) {return !(x == y);}
-inline bool operator> (const date::year& x, const Rule& y) {return   y < x;}
-inline bool operator<=(const date::year& x, const Rule& y) {return !(y < x);}
-inline bool operator>=(const date::year& x, const Rule& y) {return !(x < y);}
-
-inline bool operator!=(const Rule& x, const std::string& y) {return !(x == y);}
-inline bool operator> (const Rule& x, const std::string& y) {return   y < x;}
-inline bool operator<=(const Rule& x, const std::string& y) {return !(y < x);}
-inline bool operator>=(const Rule& x, const std::string& y) {return !(x < y);}
-
-inline bool operator!=(const std::string& x, const Rule& y) {return !(x == y);}
-inline bool operator> (const std::string& x, const Rule& y) {return   y < x;}
-inline bool operator<=(const std::string& x, const Rule& y) {return !(y < x);}
-inline bool operator>=(const std::string& x, const Rule& y) {return !(x < y);}
-
-struct zonelet
-{
-    enum tag {has_rule, has_save, is_empty};
-
-    std::chrono::seconds gmtoff_;
-    tag tag_ = has_rule;
-
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
-    union U
-#else
-    struct U
-#endif
-    {
-        std::string          rule_;
-        std::chrono::minutes save_;
-
-        ~U() {}
-        U() {}
-        U(const U&) {}
-        U& operator=(const U&) = delete;
-    } u;
-
-    std::string                        format_;
-    date::year                         until_year_{0};
-    MonthDayTime                       until_date_;
-    sys_seconds                        until_utc_;
-    local_seconds                      until_std_;
-    local_seconds                      until_loc_;
-    std::chrono::minutes               initial_save_{};
-    std::string                        initial_abbrev_;
-    std::pair<const Rule*, date::year> first_rule_{nullptr, date::year::min()};
-    std::pair<const Rule*, date::year> last_rule_{nullptr, date::year::max()};
-
-    ~zonelet();
-    zonelet();
-    zonelet(const zonelet& i);
-    zonelet& operator=(const zonelet&) = delete;
-};
-
-#else  // USE_OS_TZDB
-
-struct ttinfo
-{
-    std::int32_t  tt_gmtoff;
-    unsigned char tt_isdst;
-    unsigned char tt_abbrind;
-    unsigned char pad[2];
-};
-
-static_assert(sizeof(ttinfo) == 8, "");
-
-struct expanded_ttinfo
-{
-    std::chrono::seconds offset;
-    std::string          abbrev;
-    bool                 is_dst;
-};
-
-struct transition
-{
-    sys_seconds            timepoint;
-    const expanded_ttinfo* info;
-
-    transition(sys_seconds tp, const expanded_ttinfo* i = nullptr)
-        : timepoint(tp)
-        , info(i)
-        {}
-
-    friend
-    std::ostream&
-    operator<<(std::ostream& os, const transition& t)
-    {
-        using date::operator<<;
-        os << t.timepoint << "Z ";
-        if (t.info->offset >= std::chrono::seconds{0})
-            os << '+';
-        os << make_time(t.info->offset);
-        if (t.info->is_dst > 0)
-            os << " daylight ";
-        else
-            os << " standard ";
-        os << t.info->abbrev;
-        return os;
-    }
-};
-
-#endif  // USE_OS_TZDB
-
-}  // namespace detail
-
-}  // namespace date
-
-#if defined(_MSC_VER) && (_MSC_VER < 1900)
-#include "tz.h"
-#endif
-
-#endif  // TZ_PRIVATE_H




diff --git a/src/libs/date/src/tz.cpp b/src/libs/date/src/tz.cpp
deleted file mode 100644
index ad4e90e7a5c57053374881d844d5a667f67b3171..0000000000000000000000000000000000000000
--- a/src/libs/date/src/tz.cpp
+++ /dev/null
@@ -1,3825 +0,0 @@
-// The MIT License (MIT)
-//
-// Copyright (c) 2015, 2016, 2017 Howard Hinnant
-// Copyright (c) 2015 Ville Voutilainen
-// Copyright (c) 2016 Alexander Kormanovsky
-// Copyright (c) 2016, 2017 Jiangang Zhuang
-// Copyright (c) 2017 Nicolas Veloz Savino
-// Copyright (c) 2017 Florian Dang
-// Copyright (c) 2017 Aaron Bishop
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-//
-// Our apologies.  When the previous paragraph was written, lowercase had not yet
-// been invented (that would involve another several millennia of evolution).
-// We did not mean to shout.
-
-#ifdef _WIN32
-   // windows.h will be included directly and indirectly (e.g. by curl).
-   // We need to define these macros to prevent windows.h bringing in
-   // more than we need and do it early so windows.h doesn't get included
-   // without these macros having been defined.
-   // min/max macros interfere with the C++ versions.
-#  ifndef NOMINMAX
-#    define NOMINMAX
-#  endif
-   // We don't need all that Windows has to offer.
-#  ifndef WIN32_LEAN_AND_MEAN
-#    define WIN32_LEAN_AND_MEAN
-#  endif
-
-   // for wcstombs
-#  ifndef _CRT_SECURE_NO_WARNINGS
-#    define _CRT_SECURE_NO_WARNINGS
-#  endif
-
-   // None of this happens with the MS SDK (at least VS14 which I tested), but:
-   // Compiling with mingw, we get "error: 'KF_FLAG_DEFAULT' was not declared in this scope."
-   // and error: 'SHGetKnownFolderPath' was not declared in this scope.".
-   // It seems when using mingw NTDDI_VERSION is undefined and that
-   // causes KNOWN_FOLDER_FLAG and the KF_ flags to not get defined.
-   // So we must define NTDDI_VERSION to get those flags on mingw.
-   // The docs say though here:
-   // https://msdn.microsoft.com/en-nz/library/windows/desktop/aa383745(v=vs.85).aspx
-   // that "If you define NTDDI_VERSION, you must also define _WIN32_WINNT."
-   // So we declare we require Vista or greater.
-#  ifdef __MINGW32__
-
-#    ifndef NTDDI_VERSION
-#      define NTDDI_VERSION 0x06000000
-#      define _WIN32_WINNT _WIN32_WINNT_VISTA
-#    elif NTDDI_VERSION < 0x06000000
-#      warning "If this fails to compile NTDDI_VERSION may be to low. See comments above."
-#    endif
-     // But once we define the values above we then get this linker error:
-     // "tz.cpp:(.rdata$.refptr.FOLDERID_Downloads[.refptr.FOLDERID_Downloads]+0x0): "
-     //     "undefined reference to `FOLDERID_Downloads'"
-     // which #include <initguid.h> cures see:
-     // https://support.microsoft.com/en-us/kb/130869
-#    include <initguid.h>
-     // But with <initguid.h> included, the error moves on to:
-     // error: 'FOLDERID_Downloads' was not declared in this scope
-     // Which #include <knownfolders.h> cures.
-#    include <knownfolders.h>
-
-#  endif  // __MINGW32__
-
-#  include <windows.h>
-#endif  // _WIN32
-
-#include "date/tz_private.h"
-
-#ifdef __APPLE__
-#  include "date/ios.h"
-#else
-#  define TARGET_OS_IPHONE 0
-#endif
-
-#if USE_OS_TZDB
-#  include <dirent.h>
-#endif
-#include <algorithm>
-#include <cctype>
-#include <cstdlib>
-#include <cstring>
-#include <cwchar>
-#include <exception>
-#include <fstream>
-#include <iostream>
-#include <iterator>
-#include <memory>
-#if USE_OS_TZDB
-#  include <queue>
-#endif
-#include <sstream>
-#include <string>
-#include <tuple>
-#include <vector>
-#include <sys/stat.h>
-
-// unistd.h is used on some platforms as part of the the means to get
-// the current time zone. On Win32 windows.h provides a means to do it.
-// gcc/mingw supports unistd.h on Win32 but MSVC does not.
-
-#ifdef _WIN32
-#  ifdef WINAPI_FAMILY
-#    include <winapifamily.h>
-#    if WINAPI_FAMILY != WINAPI_FAMILY_DESKTOP_APP
-#      define WINRT
-#      define INSTALL .
-#    endif
-#  endif
-
-#  include <io.h> // _unlink etc.
-
-#  if defined(__clang__)
-    struct IUnknown;    // fix for issue with static_cast<> in objbase.h
-                        //   (see https://github.com/philsquared/Catch/issues/690)
-#  endif
-
-#  include <shlobj.h> // CoTaskFree, ShGetKnownFolderPath etc.
-#  if HAS_REMOTE_API
-#    include <direct.h> // _mkdir
-#    include <shellapi.h> // ShFileOperation etc.
-#  endif  // HAS_REMOTE_API
-#else   // !_WIN32
-#  include <unistd.h>
-#  if !USE_OS_TZDB
-#    include <wordexp.h>
-#  endif
-#  include <limits.h>
-#  include <string.h>
-#  if !USE_SHELL_API
-#    include <sys/stat.h>
-#    include <sys/fcntl.h>
-#    include <dirent.h>
-#    include <cstring>
-#    include <sys/wait.h>
-#    include <sys/types.h>
-#  endif //!USE_SHELL_API
-#endif  // !_WIN32
-
-
-#if HAS_REMOTE_API
-   // Note curl includes windows.h so we must include curl AFTER definitions of things
-   // that affect windows.h such as NOMINMAX.
-#if defined(_MSC_VER) && defined(SHORTENED_CURL_INCLUDE)
-   // For rmt_curl nuget package
-#  include <curl.h>
-#else
-#  include <curl/curl.h>
-#endif
-#endif
-
-#ifdef _WIN32
-static CONSTDATA char folder_delimiter = '\\';
-#else   // !_WIN32
-static CONSTDATA char folder_delimiter = '/';
-#endif  // !_WIN32
-
-#if defined(__GNUC__) && __GNUC__ < 5
-   // GCC 4.9 Bug 61489 Wrong warning with -Wmissing-field-initializers
-#  pragma GCC diagnostic push
-#  pragma GCC diagnostic ignored "-Wmissing-field-initializers"
-#endif  // defined(__GNUC__) && __GNUC__ < 5
-
-#if !USE_OS_TZDB
-
-#  ifdef _WIN32
-#    ifndef WINRT
-
-namespace
-{
-    struct task_mem_deleter
-    {
-        void operator()(wchar_t buf[])
-        {
-            if (buf != nullptr)
-                CoTaskMemFree(buf);
-        }
-    };
-    using co_task_mem_ptr = std::unique_ptr<wchar_t[], task_mem_deleter>;
-}
-
-// We might need to know certain locations even if not using the remote API,
-// so keep these routines out of that block for now.
-static
-std::string
-get_known_folder(const GUID& folderid)
-{
-    std::string folder;
-    PWSTR pfolder = nullptr;
-    HRESULT hr = SHGetKnownFolderPath(folderid, KF_FLAG_DEFAULT, nullptr, &pfolder);
-    if (SUCCEEDED(hr))
-    {
-        co_task_mem_ptr folder_ptr(pfolder);
-        const wchar_t* fptr = folder_ptr.get();
-        auto state = std::mbstate_t();
-        const auto required = std::wcsrtombs(nullptr, &fptr, 0, &state);
-        if (required != 0 && required != std::size_t(-1))
-        {
-            folder.resize(required);
-            std::wcsrtombs(&folder[0], &fptr, folder.size(), &state);
-        }
-    }
-    return folder;
-}
-
-#      ifndef INSTALL
-
-// Usually something like "c:\Users\username\Downloads".
-static
-std::string
-get_download_folder()
-{
-    return get_known_folder(FOLDERID_Downloads);
-}
-
-#      endif  // !INSTALL
-
-#    endif // WINRT
-#  else // !_WIN32
-
-#    if !defined(INSTALL)
-
-static
-std::string
-expand_path(std::string path)
-{
-#      if TARGET_OS_IPHONE
-    return date::iOSUtils::get_tzdata_path();
-#      else  // !TARGET_OS_IPHONE
-    ::wordexp_t w{};
-    std::unique_ptr<::wordexp_t, void(*)(::wordexp_t*)> hold{&w, ::wordfree};
-    ::wordexp(path.c_str(), &w, 0);
-    if (w.we_wordc != 1)
-        throw std::runtime_error("Cannot expand path: " + path);
-    path = w.we_wordv[0];
-    return path;
-#      endif  // !TARGET_OS_IPHONE
-}
-
-static
-std::string
-get_download_folder()
-{
-    return expand_path("~/Downloads");
-}
-
-#    endif // !defined(INSTALL)
-
-#  endif  // !_WIN32
-
-#endif  // !USE_OS_TZDB
-
-namespace date
-{
-// +---------------------+
-// | Begin Configuration |
-// +---------------------+
-
-using namespace detail;
-
-#if !USE_OS_TZDB
-
-static
-std::string&
-access_install()
-{
-    static std::string install
-#ifndef INSTALL
-
-    = get_download_folder() + folder_delimiter + "tzdata";
-
-#else   // !INSTALL
-
-#  define STRINGIZEIMP(x) #x
-#  define STRINGIZE(x) STRINGIZEIMP(x)
-
-    = STRINGIZE(INSTALL) + std::string(1, folder_delimiter) + "tzdata";
-
-    #undef STRINGIZEIMP
-    #undef STRINGIZE
-#endif  // !INSTALL
-
-    return install;
-}
-
-void
-set_install(const std::string& s)
-{
-    access_install() = s;
-}
-
-static
-const std::string&
-get_install()
-{
-    static const std::string& ref = access_install();
-    return ref;
-}
-
-#if HAS_REMOTE_API
-static
-std::string
-get_download_gz_file(const std::string& version)
-{
-    auto file = get_install() + version + ".tar.gz";
-    return file;
-}
-#endif  // HAS_REMOTE_API
-
-#endif  // !USE_OS_TZDB
-
-// These can be used to reduce the range of the database to save memory
-CONSTDATA auto min_year = date::year::min();
-CONSTDATA auto max_year = date::year::max();
-
-CONSTDATA auto min_day = date::January/1;
-CONSTDATA auto max_day = date::December/31;
-
-#if USE_OS_TZDB
-
-CONSTCD14 const sys_seconds min_seconds = sys_days(min_year/min_day);
-
-#endif  // USE_OS_TZDB
-
-#ifndef _WIN32
-
-static
-std::string
-discover_tz_dir()
-{
-    struct stat sb;
-    using namespace std;
-#  ifndef __APPLE__
-    CONSTDATA auto tz_dir_default = "/usr/share/zoneinfo";
-    CONSTDATA auto tz_dir_buildroot = "/usr/share/zoneinfo/uclibc";
-
-    // Check special path which is valid for buildroot with uclibc builds
-    if(stat(tz_dir_buildroot, &sb) == 0 && S_ISDIR(sb.st_mode))
-        return tz_dir_buildroot;
-    else if(stat(tz_dir_default, &sb) == 0 && S_ISDIR(sb.st_mode))
-        return tz_dir_default;
-    else
-        throw runtime_error("discover_tz_dir failed to find zoneinfo\n");
-#  else  // __APPLE__
-#      if TARGET_OS_IPHONE
-    return "/var/db/timezone/zoneinfo";
-#      else
-    CONSTDATA auto timezone = "/etc/localtime";
-    if (!(lstat(timezone, &sb) == 0 && S_ISLNK(sb.st_mode) && sb.st_size > 0))
-        throw runtime_error("discover_tz_dir failed\n");
-    string result;
-    char rp[PATH_MAX+1] = {};
-    if (readlink(timezone, rp, sizeof(rp)-1) > 0)
-        result = string(rp);
-    else
-        throw system_error(errno, system_category(), "readlink() failed");
-    auto i = result.find("zoneinfo");
-    if (i == string::npos)
-        throw runtime_error("discover_tz_dir failed to find zoneinfo\n");
-    i = result.find('/', i);
-    if (i == string::npos)
-        throw runtime_error("discover_tz_dir failed to find '/'\n");
-    return result.substr(0, i);
-#      endif
-#  endif  // __APPLE__
-}
-
-static
-const std::string&
-get_tz_dir()
-{
-    static const std::string tz_dir = discover_tz_dir();
-    return tz_dir;
-}
-
-#endif
-
-// +-------------------+
-// | End Configuration |
-// +-------------------+
-
-#ifndef _MSC_VER
-static_assert(min_year <= max_year, "Configuration error");
-#endif
-
-static std::unique_ptr<tzdb> init_tzdb();
-
-tzdb_list::~tzdb_list()
-{
-    const tzdb* ptr = head_;
-    head_ = nullptr;
-    while (ptr != nullptr)
-    {
-        auto next = ptr->next;
-        delete ptr;
-        ptr = next;
-    }
-}
-
-tzdb_list::tzdb_list(tzdb_list&& x) noexcept
-   : head_{x.head_.exchange(nullptr)}
-{
-}
-
-void
-tzdb_list::push_front(tzdb* tzdb) noexcept
-{
-    tzdb->next = head_;
-    head_ = tzdb;
-}
-
-tzdb_list::const_iterator
-tzdb_list::erase_after(const_iterator p) noexcept
-{
-    auto t = p.p_->next;
-    p.p_->next = p.p_->next->next;
-    delete t;
-    return ++p;
-}
-
-struct tzdb_list::undocumented_helper
-{
-    static void push_front(tzdb_list& db_list, tzdb* tzdb) noexcept
-    {
-        db_list.push_front(tzdb);
-    }
-};
-
-static
-tzdb_list
-create_tzdb()
-{
-    tzdb_list tz_db;
-    tzdb_list::undocumented_helper::push_front(tz_db, init_tzdb().release());
-    return tz_db;
-}
-
-tzdb_list&
-get_tzdb_list()
-{
-    static tzdb_list tz_db = create_tzdb();
-    return tz_db;
-}
-
-#if !USE_OS_TZDB
-
-#ifdef _WIN32
-
-static
-void
-sort_zone_mappings(std::vector<date::detail::timezone_mapping>& mappings)
-{
-    std::sort(mappings.begin(), mappings.end(),
-        [](const date::detail::timezone_mapping& lhs,
-           const date::detail::timezone_mapping& rhs)->bool
-    {
-        auto other_result = lhs.other.compare(rhs.other);
-        if (other_result < 0)
-            return true;
-        else if (other_result == 0)
-        {
-            auto territory_result = lhs.territory.compare(rhs.territory);
-            if (territory_result < 0)
-                return true;
-            else if (territory_result == 0)
-            {
-                if (lhs.type < rhs.type)
-                    return true;
-            }
-        }
-        return false;
-    });
-}
-
-static
-bool
-native_to_standard_timezone_name(const std::string& native_tz_name,
-                                 std::string& standard_tz_name)
-{
-    // TOOD! Need be a case insensitive compare?
-    if (native_tz_name == "UTC")
-    {
-        standard_tz_name = "Etc/UTC";
-        return true;
-    }
-    standard_tz_name.clear();
-    // TODO! we can improve on linear search.
-    const auto& mappings = date::get_tzdb().mappings;
-    for (const auto& tzm : mappings)
-    {
-        if (tzm.other == native_tz_name)
-        {
-            standard_tz_name = tzm.type;
-            return true;
-        }
-    }
-    return false;
-}
-
-// Parse this XML file:
-// https://raw.githubusercontent.com/unicode-org/cldr/master/common/supplemental/windowsZones.xml
-// The parsing method is designed to be simple and quick. It is not overly
-// forgiving of change but it should diagnose basic format issues.
-// See timezone_mapping structure for more info.
-static
-std::vector<detail::timezone_mapping>
-load_timezone_mappings_from_xml_file(const std::string& input_path)
-{
-    std::size_t line_num = 0;
-    std::vector<detail::timezone_mapping> mappings;
-    std::string line;
-
-    std::ifstream is(input_path);
-    if (!is.is_open())
-    {
-        // We don't emit file exceptions because that's an implementation detail.
-        std::string msg = "Error opening time zone mapping file \"";
-        msg += input_path;
-        msg += "\".";
-        throw std::runtime_error(msg);
-    }
-
-    auto error = [&input_path, &line_num](const char* info)
-    {
-        std::string msg = "Error loading time zone mapping file \"";
-        msg += input_path;
-        msg += "\" at line ";
-        msg += std::to_string(line_num);
-        msg += ": ";
-        msg += info;
-        throw std::runtime_error(msg);
-    };
-    // [optional space]a="b"
-    auto read_attribute = [&line, &error]
-                          (const char* name, std::string& value, std::size_t startPos)
-                          ->std::size_t
-    {
-        value.clear();
-        // Skip leading space before attribute name.
-        std::size_t spos = line.find_first_not_of(' ', startPos);
-        if (spos == std::string::npos)
-            spos = startPos;
-        // Assume everything up to next = is the attribute name
-        // and that an = will always delimit that.
-        std::size_t epos = line.find('=', spos);
-        if (epos == std::string::npos)
-            error("Expected \'=\' right after attribute name.");
-        std::size_t name_len = epos - spos;
-        // Expect the name we find matches the name we expect.
-        if (line.compare(spos, name_len, name) != 0)
-        {
-            std::string msg;
-            msg = "Expected attribute name \'";
-            msg += name;
-            msg += "\' around position ";
-            msg += std::to_string(spos);
-            msg += " but found something else.";
-            error(msg.c_str());
-        }
-        ++epos; // Skip the '=' that is after the attribute name.
-        spos = epos;
-        if (spos < line.length() && line[spos] == '\"')
-            ++spos; // Skip the quote that is before the attribute value.
-        else
-        {
-            std::string msg = "Expected '\"' to begin value of attribute \'";
-            msg += name;
-            msg += "\'.";
-            error(msg.c_str());
-        }
-        epos = line.find('\"', spos);
-        if (epos == std::string::npos)
-        {
-            std::string msg = "Expected '\"' to end value of attribute \'";
-            msg += name;
-            msg += "\'.";
-            error(msg.c_str());
-        }
-        // Extract everything in between the quotes. Note no escaping is done.
-        std::size_t value_len = epos - spos;
-        value.assign(line, spos, value_len);
-        ++epos; // Skip the quote that is after the attribute value;
-        return epos;
-    };
-
-    // Quick but not overly forgiving XML mapping file processing.
-    bool mapTimezonesOpenTagFound = false;
-    bool mapTimezonesCloseTagFound = false;
-    std::size_t mapZonePos = std::string::npos;
-    std::size_t mapTimezonesPos = std::string::npos;
-    CONSTDATA char mapTimeZonesOpeningTag[] = { "<mapTimezones " };
-    CONSTDATA char mapZoneOpeningTag[] = { "<mapZone " };
-    CONSTDATA std::size_t mapZoneOpeningTagLen = sizeof(mapZoneOpeningTag) /
-                                                 sizeof(mapZoneOpeningTag[0]) - 1;
-    while (!mapTimezonesOpenTagFound)
-    {
-        std::getline(is, line);
-        ++line_num;
-        if (is.eof())
-        {
-            // If there is no mapTimezones tag is it an error?
-            // Perhaps if there are no mapZone mappings it might be ok for
-            // its parent mapTimezones element to be missing?
-            // We treat this as an error though on the assumption that if there
-            // really are no mappings we should still get a mapTimezones parent
-            // element but no mapZone elements inside. Assuming we must
-            // find something will hopefully at least catch more drastic formatting
-            // changes or errors than if we don't do this and assume nothing found.
-            error("Expected a mapTimezones opening tag.");
-        }
-        mapTimezonesPos = line.find(mapTimeZonesOpeningTag);
-        mapTimezonesOpenTagFound = (mapTimezonesPos != std::string::npos);
-    }
-
-    // NOTE: We could extract the version info that follows the opening
-    // mapTimezones tag and compare that to the version of other data we have.
-    // I would have expected them to be kept in synch but testing has shown
-    // it typically does not match anyway. So what's the point?
-    while (!mapTimezonesCloseTagFound)
-    {
-        std::ws(is);
-        std::getline(is, line);
-        ++line_num;
-        if (is.eof())
-            error("Expected a mapTimezones closing tag.");
-        if (line.empty())
-            continue;
-        mapZonePos = line.find(mapZoneOpeningTag);
-        if (mapZonePos != std::string::npos)
-        {
-            mapZonePos += mapZoneOpeningTagLen;
-            detail::timezone_mapping zm{};
-            std::size_t pos = read_attribute("other", zm.other, mapZonePos);
-            pos = read_attribute("territory", zm.territory, pos);
-            read_attribute("type", zm.type, pos);
-            mappings.push_back(std::move(zm));
-
-            continue;
-        }
-        mapTimezonesPos = line.find("</mapTimezones>");
-        mapTimezonesCloseTagFound = (mapTimezonesPos != std::string::npos);
-        if (!mapTimezonesCloseTagFound)
-        {
-            std::size_t commentPos = line.find("<!--");
-            if (commentPos == std::string::npos)
-                error("Unexpected mapping record found. A xml mapZone or comment "
-                      "attribute or mapTimezones closing tag was expected.");
-        }
-    }
-
-    is.close();
-    return mappings;
-}
-
-#endif  // _WIN32
-
-// Parsing helpers
-
-static
-std::string
-parse3(std::istream& in)
-{
-    std::string r(3, ' ');
-    ws(in);
-    r[0] = static_cast<char>(in.get());
-    r[1] = static_cast<char>(in.get());
-    r[2] = static_cast<char>(in.get());
-    return r;
-}
-
-static
-unsigned
-parse_dow(std::istream& in)
-{
-    CONSTDATA char*const dow_names[] =
-        {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
-    auto s = parse3(in);
-    auto dow = std::find(std::begin(dow_names), std::end(dow_names), s) - dow_names;
-    if (dow >= std::end(dow_names) - std::begin(dow_names))
-        throw std::runtime_error("oops: bad dow name: " + s);
-    return static_cast<unsigned>(dow);
-}
-
-static
-unsigned
-parse_month(std::istream& in)
-{
-    CONSTDATA char*const month_names[] =
-        {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
-         "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
-    auto s = parse3(in);
-    auto m = std::find(std::begin(month_names), std::end(month_names), s) - month_names;
-    if (m >= std::end(month_names) - std::begin(month_names))
-        throw std::runtime_error("oops: bad month name: " + s);
-    return static_cast<unsigned>(++m);
-}
-
-static
-std::chrono::seconds
-parse_unsigned_time(std::istream& in)
-{
-    using namespace std::chrono;
-    int x;
-    in >> x;
-    auto r = seconds{hours{x}};
-    if (!in.eof() && in.peek() == ':')
-    {
-        in.get();
-        in >> x;
-        r += minutes{x};
-        if (!in.eof() && in.peek() == ':')
-        {
-            in.get();
-            in >> x;
-            r += seconds{x};
-        }
-    }
-    return r;
-}
-
-static
-std::chrono::seconds
-parse_signed_time(std::istream& in)
-{
-    ws(in);
-    auto sign = 1;
-    if (in.peek() == '-')
-    {
-        sign = -1;
-        in.get();
-    }
-    else if (in.peek() == '+')
-        in.get();
-    return sign * parse_unsigned_time(in);
-}
-
-// MonthDayTime
-
-detail::MonthDayTime::MonthDayTime(local_seconds tp, tz timezone)
-    : zone_(timezone)
-{
-    using namespace date;
-    const auto dp = date::floor<days>(tp);
-    const auto hms = make_time(tp - dp);
-    const auto ymd = year_month_day(dp);
-    u = ymd.month() / ymd.day();
-    h_ = hms.hours();
-    m_ = hms.minutes();
-    s_ = hms.seconds();
-}
-
-detail::MonthDayTime::MonthDayTime(const date::month_day& md, tz timezone)
-    : zone_(timezone)
-{
-    u = md;
-}
-
-date::day
-detail::MonthDayTime::day() const
-{
-    switch (type_)
-    {
-    case month_day:
-        return u.month_day_.day();
-    case month_last_dow:
-        return date::day{31};
-    case lteq:
-    case gteq:
-        break;
-    }
-    return u.month_day_weekday_.month_day_.day();
-}
-
-date::month
-detail::MonthDayTime::month() const
-{
-    switch (type_)
-    {
-    case month_day:
-        return u.month_day_.month();
-    case month_last_dow:
-        return u.month_weekday_last_.month();
-    case lteq:
-    case gteq:
-        break;
-    }
-    return u.month_day_weekday_.month_day_.month();
-}
-
-int
-detail::MonthDayTime::compare(date::year y, const MonthDayTime& x, date::year yx,
-                      std::chrono::seconds offset, std::chrono::minutes prev_save) const
-{
-    if (zone_ != x.zone_)
-    {
-        auto dp0 = to_sys_days(y);
-        auto dp1 = x.to_sys_days(yx);
-        if (std::abs((dp0-dp1).count()) > 1)
-            return dp0 < dp1 ? -1 : 1;
-        if (zone_ == tz::local)
-        {
-            auto tp0 = to_time_point(y) - prev_save;
-            if (x.zone_ == tz::utc)
-                tp0 -= offset;
-            auto tp1 = x.to_time_point(yx);
-            return tp0 < tp1 ? -1 : tp0 == tp1 ? 0 : 1;
-        }
-        else if (zone_ == tz::standard)
-        {
-            auto tp0 = to_time_point(y);
-            auto tp1 = x.to_time_point(yx);
-            if (x.zone_ == tz::local)
-                tp1 -= prev_save;
-            else
-                tp0 -= offset;
-            return tp0 < tp1 ? -1 : tp0 == tp1 ? 0 : 1;
-        }
-        // zone_ == tz::utc
-        auto tp0 = to_time_point(y);
-        auto tp1 = x.to_time_point(yx);
-        if (x.zone_ == tz::local)
-            tp1 -= offset + prev_save;
-        else
-            tp1 -= offset;
-        return tp0 < tp1 ? -1 : tp0 == tp1 ? 0 : 1;
-    }
-    auto const t0 = to_time_point(y);
-    auto const t1 = x.to_time_point(yx);
-    return t0 < t1 ? -1 : t0 == t1 ? 0 : 1;
-}
-
-sys_seconds
-detail::MonthDayTime::to_sys(date::year y, std::chrono::seconds offset,
-                     std::chrono::seconds save) const
-{
-    using namespace date;
-    using namespace std::chrono;
-    auto until_utc = to_time_point(y);
-    if (zone_ == tz::standard)
-        until_utc -= offset;
-    else if (zone_ == tz::local)
-        until_utc -= offset + save;
-    return until_utc;
-}
-
-detail::MonthDayTime::U&
-detail::MonthDayTime::U::operator=(const date::month_day& x)
-{
-    month_day_ = x;
-    return *this;
-}
-
-detail::MonthDayTime::U&
-detail::MonthDayTime::U::operator=(const date::month_weekday_last& x)
-{
-    month_weekday_last_ = x;
-    return *this;
-}
-
-detail::MonthDayTime::U&
-detail::MonthDayTime::U::operator=(const pair& x)
-{
-    month_day_weekday_ = x;
-    return *this;
-}
-
-date::sys_days
-detail::MonthDayTime::to_sys_days(date::year y) const
-{
-    using namespace std::chrono;
-    using namespace date;
-    switch (type_)
-    {
-    case month_day:
-        return sys_days(y/u.month_day_);
-    case month_last_dow:
-        return sys_days(y/u.month_weekday_last_);
-    case lteq:
-        {
-            auto const x = y/u.month_day_weekday_.month_day_;
-            auto const wd1 = weekday(static_cast<sys_days>(x));
-            auto const wd0 = u.month_day_weekday_.weekday_;
-            return sys_days(x) - (wd1-wd0);
-        }
-    case gteq:
-        break;
-    }
-    auto const x = y/u.month_day_weekday_.month_day_;
-    auto const wd1 = u.month_day_weekday_.weekday_;
-    auto const wd0 = weekday(static_cast<sys_days>(x));
-    return sys_days(x) + (wd1-wd0);
-}
-
-sys_seconds
-detail::MonthDayTime::to_time_point(date::year y) const
-{
-    // Add seconds first to promote to largest rep early to prevent overflow
-    return to_sys_days(y) + s_ + h_ + m_;
-}
-
-void
-detail::MonthDayTime::canonicalize(date::year y)
-{
-    using namespace std::chrono;
-    using namespace date;
-    switch (type_)
-    {
-    case month_day:
-        return;
-    case month_last_dow:
-        {
-            auto const ymd = year_month_day(sys_days(y/u.month_weekday_last_));
-            u.month_day_ = ymd.month()/ymd.day();
-            type_ = month_day;
-            return;
-        }
-    case lteq:
-        {
-            auto const x = y/u.month_day_weekday_.month_day_;
-            auto const wd1 = weekday(static_cast<sys_days>(x));
-            auto const wd0 = u.month_day_weekday_.weekday_;
-            auto const ymd = year_month_day(sys_days(x) - (wd1-wd0));
-            u.month_day_ = ymd.month()/ymd.day();
-            type_ = month_day;
-            return;
-        }
-    case gteq:
-        {
-            auto const x = y/u.month_day_weekday_.month_day_;
-            auto const wd1 = u.month_day_weekday_.weekday_;
-            auto const wd0 = weekday(static_cast<sys_days>(x));
-            auto const ymd = year_month_day(sys_days(x) + (wd1-wd0));
-            u.month_day_ = ymd.month()/ymd.day();
-            type_ = month_day;
-            return;
-        }
-    }
-}
-
-std::istream&
-detail::operator>>(std::istream& is, MonthDayTime& x)
-{
-    using namespace date;
-    using namespace std::chrono;
-    assert(((std::ios::failbit | std::ios::badbit) & is.exceptions()) ==
-            (std::ios::failbit | std::ios::badbit));
-    x = MonthDayTime{};
-    if (!is.eof() && ws(is) && !is.eof() && is.peek() != '#')
-    {
-        auto m = parse_month(is);
-        if (!is.eof() && ws(is) && !is.eof() && is.peek() != '#')
-        {
-            if (is.peek() == 'l')
-            {
-                for (int i = 0; i < 4; ++i)
-                    is.get();
-                auto dow = parse_dow(is);
-                x.type_ = MonthDayTime::month_last_dow;
-                x.u = date::month(m)/weekday(dow)[last];
-            }
-            else if (std::isalpha(is.peek()))
-            {
-                auto dow = parse_dow(is);
-                char c{};
-                is >> c;
-                if (c == '<' || c == '>')
-                {
-                    char c2{};
-                    is >> c2;
-                    if (c2 != '=')
-                        throw std::runtime_error(std::string("bad operator: ") + c + c2);
-                    int d;
-                    is >> d;
-                    if (d < 1 || d > 31)
-                        throw std::runtime_error(std::string("bad operator: ") + c + c2
-                                 + std::to_string(d));
-                    x.type_ = c == '<' ? MonthDayTime::lteq : MonthDayTime::gteq;
-                    x.u = MonthDayTime::pair{ date::month(m) / d, date::weekday(dow) };
-                }
-                else
-                    throw std::runtime_error(std::string("bad operator: ") + c);
-            }
-            else  // if (std::isdigit(is.peek())
-            {
-                int d;
-                is >> d;
-                if (d < 1 || d > 31)
-                    throw std::runtime_error(std::string("day of month: ")
-                             + std::to_string(d));
-                x.type_ = MonthDayTime::month_day;
-                x.u = date::month(m)/d;
-            }
-            if (!is.eof() && ws(is) && !is.eof() && is.peek() != '#')
-            {
-                int t;
-                is >> t;
-                x.h_ = hours{t};
-                if (!is.eof() && is.peek() == ':')
-                {
-                    is.get();
-                    is >> t;
-                    x.m_ = minutes{t};
-                    if (!is.eof() && is.peek() == ':')
-                    {
-                        is.get();
-                        is >> t;
-                        x.s_ = seconds{t};
-                    }
-                }
-                if (!is.eof() && std::isalpha(is.peek()))
-                {
-                    char c;
-                    is >> c;
-                    switch (c)
-                    {
-                    case 's':
-                        x.zone_ = tz::standard;
-                        break;
-                    case 'u':
-                        x.zone_ = tz::utc;
-                        break;
-                    }
-                }
-            }
-        }
-        else
-        {
-            x.u = month{m}/1;
-        }
-    }
-    return is;
-}
-
-std::ostream&
-detail::operator<<(std::ostream& os, const MonthDayTime& x)
-{
-    switch (x.type_)
-    {
-    case MonthDayTime::month_day:
-        os << x.u.month_day_ << "                  ";
-        break;
-    case MonthDayTime::month_last_dow:
-        os << x.u.month_weekday_last_ << "           ";
-        break;
-    case MonthDayTime::lteq:
-        os << x.u.month_day_weekday_.weekday_ << " on or before "
-           << x.u.month_day_weekday_.month_day_ << "  ";
-        break;
-    case MonthDayTime::gteq:
-        if ((static_cast<unsigned>(x.day()) - 1) % 7 == 0)
-        {
-            os << (x.u.month_day_weekday_.month_day_.month() /
-                   x.u.month_day_weekday_.weekday_[
-                       (static_cast<unsigned>(x.day()) - 1)/7+1]) << "              ";
-        }
-        else
-        {
-            os << x.u.month_day_weekday_.weekday_ << " on or after "
-               << x.u.month_day_weekday_.month_day_ << "  ";
-        }
-        break;
-    }
-    os << date::make_time(x.s_ + x.h_ + x.m_);
-    if (x.zone_ == tz::utc)
-        os << "UTC   ";
-    else if (x.zone_ == tz::standard)
-        os << "STD   ";
-    else
-        os << "      ";
-    return os;
-}
-
-// Rule
-
-detail::Rule::Rule(const std::string& s)
-{
-    try
-    {
-        using namespace date;
-        using namespace std::chrono;
-        std::istringstream in(s);
-        in.exceptions(std::ios::failbit | std::ios::badbit);
-        std::string word;
-        in >> word >> name_;
-        int x;
-        ws(in);
-        if (std::isalpha(in.peek()))
-        {
-            in >> word;
-            if (word == "min")
-            {
-                starting_year_ = year::min();
-            }
-            else
-                throw std::runtime_error("Didn't find expected word: " + word);
-        }
-        else
-        {
-            in >> x;
-            starting_year_ = year{x};
-        }
-        std::ws(in);
-        if (std::isalpha(in.peek()))
-        {
-            in >> word;
-            if (word == "only")
-            {
-                ending_year_ = starting_year_;
-            }
-            else if (word == "max")
-            {
-                ending_year_ = year::max();
-            }
-            else
-                throw std::runtime_error("Didn't find expected word: " + word);
-        }
-        else
-        {
-            in >> x;
-            ending_year_ = year{x};
-        }
-        in >> word;  // TYPE (always "-")
-        assert(word == "-");
-        in >> starting_at_;
-        save_ = duration_cast<minutes>(parse_signed_time(in));
-        in >> abbrev_;
-        if (abbrev_ == "-")
-            abbrev_.clear();
-        assert(hours{-1} <= save_ && save_ <= hours{2});
-    }
-    catch (...)
-    {
-        std::cerr << s << '\n';
-        std::cerr << *this << '\n';
-        throw;
-    }
-}
-
-detail::Rule::Rule(const Rule& r, date::year starting_year, date::year ending_year)
-    : name_(r.name_)
-    , starting_year_(starting_year)
-    , ending_year_(ending_year)
-    , starting_at_(r.starting_at_)
-    , save_(r.save_)
-    , abbrev_(r.abbrev_)
-{
-}
-
-bool
-detail::operator==(const Rule& x, const Rule& y)
-{
-    if (std::tie(x.name_, x.save_, x.starting_year_, x.ending_year_) ==
-        std::tie(y.name_, y.save_, y.starting_year_, y.ending_year_))
-        return x.month() == y.month() && x.day() == y.day();
-    return false;
-}
-
-bool
-detail::operator<(const Rule& x, const Rule& y)
-{
-    using namespace std::chrono;
-    auto const xm = x.month();
-    auto const ym = y.month();
-    if (std::tie(x.name_, x.starting_year_, xm, x.ending_year_) <
-        std::tie(y.name_, y.starting_year_, ym, y.ending_year_))
-        return true;
-    if (std::tie(x.name_, x.starting_year_, xm, x.ending_year_) >
-        std::tie(y.name_, y.starting_year_, ym, y.ending_year_))
-        return false;
-    return x.day() < y.day();
-}
-
-bool
-detail::operator==(const Rule& x, const date::year& y)
-{
-    return x.starting_year_ <= y && y <= x.ending_year_;
-}
-
-bool
-detail::operator<(const Rule& x, const date::year& y)
-{
-    return x.ending_year_ < y;
-}
-
-bool
-detail::operator==(const date::year& x, const Rule& y)
-{
-    return y.starting_year_ <= x && x <= y.ending_year_;
-}
-
-bool
-detail::operator<(const date::year& x, const Rule& y)
-{
-    return x < y.starting_year_;
-}
-
-bool
-detail::operator==(const Rule& x, const std::string& y)
-{
-    return x.name() == y;
-}
-
-bool
-detail::operator<(const Rule& x, const std::string& y)
-{
-    return x.name() < y;
-}
-
-bool
-detail::operator==(const std::string& x, const Rule& y)
-{
-    return y.name() == x;
-}
-
-bool
-detail::operator<(const std::string& x, const Rule& y)
-{
-    return x < y.name();
-}
-
-std::ostream&
-detail::operator<<(std::ostream& os, const Rule& r)
-{
-    using namespace date;
-    using namespace std::chrono;
-    detail::save_ostream<char> _(os);
-    os.fill(' ');
-    os.flags(std::ios::dec | std::ios::left);
-    os.width(15);
-    os << r.name_;
-    os << r.starting_year_ << "    " << r.ending_year_ << "    ";
-    os << r.starting_at_;
-    if (r.save_ >= minutes{0})
-        os << ' ';
-    os << date::make_time(r.save_) << "   ";
-    os << r.abbrev_;
-    return os;
-}
-
-date::day
-detail::Rule::day() const
-{
-    return starting_at_.day();
-}
-
-date::month
-detail::Rule::month() const
-{
-    return starting_at_.month();
-}
-
-struct find_rule_by_name
-{
-    bool operator()(const Rule& x, const std::string& nm) const
-    {
-        return x.name() < nm;
-    }
-
-    bool operator()(const std::string& nm, const Rule& x) const
-    {
-        return nm < x.name();
-    }
-};
-
-bool
-detail::Rule::overlaps(const Rule& x, const Rule& y)
-{
-    // assume x.starting_year_ <= y.starting_year_;
-    if (!(x.starting_year_ <= y.starting_year_))
-    {
-        std::cerr << x << '\n';
-        std::cerr << y << '\n';
-        assert(x.starting_year_ <= y.starting_year_);
-    }
-    if (y.starting_year_ > x.ending_year_)
-        return false;
-    return !(x.starting_year_ == y.starting_year_ && x.ending_year_ == y.ending_year_);
-}
-
-void
-detail::Rule::split(std::vector<Rule>& rules, std::size_t i, std::size_t k, std::size_t& e)
-{
-    using namespace date;
-    using difference_type = std::vector<Rule>::iterator::difference_type;
-    // rules[i].starting_year_ <= rules[k].starting_year_ &&
-    //     rules[i].ending_year_ >= rules[k].starting_year_ &&
-    //     (rules[i].starting_year_ != rules[k].starting_year_ ||
-    //      rules[i].ending_year_ != rules[k].ending_year_)
-    assert(rules[i].starting_year_ <= rules[k].starting_year_ &&
-           rules[i].ending_year_ >= rules[k].starting_year_ &&
-           (rules[i].starting_year_ != rules[k].starting_year_ ||
-            rules[i].ending_year_ != rules[k].ending_year_));
-    if (rules[i].starting_year_ == rules[k].starting_year_)
-    {
-        if (rules[k].ending_year_ < rules[i].ending_year_)
-        {
-            rules.insert(rules.begin() + static_cast<difference_type>(k+1),
-                         Rule(rules[i], rules[k].ending_year_ + years{1},
-                              std::move(rules[i].ending_year_)));
-            ++e;
-            rules[i].ending_year_ = rules[k].ending_year_;
-        }
-        else  // rules[k].ending_year_ > rules[i].ending_year_
-        {
-            rules.insert(rules.begin() + static_cast<difference_type>(k+1),
-                         Rule(rules[k], rules[i].ending_year_ + years{1},
-                              std::move(rules[k].ending_year_)));
-            ++e;
-            rules[k].ending_year_ = rules[i].ending_year_;
-        }
-    }
-    else  // rules[i].starting_year_ < rules[k].starting_year_
-    {
-        if (rules[k].ending_year_ < rules[i].ending_year_)
-        {
-            rules.insert(rules.begin() + static_cast<difference_type>(k),
-                         Rule(rules[i], rules[k].starting_year_, rules[k].ending_year_));
-            ++k;
-            rules.insert(rules.begin() + static_cast<difference_type>(k+1),
-                         Rule(rules[i], rules[k].ending_year_ + years{1},
-                              std::move(rules[i].ending_year_)));
-            rules[i].ending_year_ = rules[k].starting_year_ - years{1};
-            e += 2;
-        }
-        else if (rules[k].ending_year_ > rules[i].ending_year_)
-        {
-            rules.insert(rules.begin() + static_cast<difference_type>(k),
-                         Rule(rules[i], rules[k].starting_year_, rules[i].ending_year_));
-            ++k;
-            rules.insert(rules.begin() + static_cast<difference_type>(k+1),
-                         Rule(rules[k], rules[i].ending_year_ + years{1},
-                         std::move(rules[k].ending_year_)));
-            e += 2;
-            rules[k].ending_year_ = std::move(rules[i].ending_year_);
-            rules[i].ending_year_ = rules[k].starting_year_ - years{1};
-        }
-        else  // rules[k].ending_year_ == rules[i].ending_year_
-        {
-            rules.insert(rules.begin() + static_cast<difference_type>(k),
-                         Rule(rules[i], rules[k].starting_year_,
-                         std::move(rules[i].ending_year_)));
-            ++k;
-            ++e;
-            rules[i].ending_year_ = rules[k].starting_year_ - years{1};
-        }
-    }
-}
-
-void
-detail::Rule::split_overlaps(std::vector<Rule>& rules, std::size_t i, std::size_t& e)
-{
-    using difference_type = std::vector<Rule>::iterator::difference_type;
-    auto j = i;
-    for (; i + 1 < e; ++i)
-    {
-        for (auto k = i + 1; k < e; ++k)
-        {
-            if (overlaps(rules[i], rules[k]))
-            {
-                split(rules, i, k, e);
-                std::sort(rules.begin() + static_cast<difference_type>(i),
-                          rules.begin() + static_cast<difference_type>(e));
-            }
-        }
-    }
-    for (; j < e; ++j)
-    {
-        if (rules[j].starting_year() == rules[j].ending_year())
-            rules[j].starting_at_.canonicalize(rules[j].starting_year());
-    }
-}
-
-void
-detail::Rule::split_overlaps(std::vector<Rule>& rules)
-{
-    using difference_type = std::vector<Rule>::iterator::difference_type;
-    for (std::size_t i = 0; i < rules.size();)
-    {
-        auto e = static_cast<std::size_t>(std::upper_bound(
-            rules.cbegin()+static_cast<difference_type>(i), rules.cend(), rules[i].name(),
-            [](const std::string& nm, const Rule& x)
-            {
-                return nm < x.name();
-            }) - rules.cbegin());
-        split_overlaps(rules, i, e);
-        auto first_rule = rules.begin() + static_cast<difference_type>(i);
-        auto last_rule = rules.begin() + static_cast<difference_type>(e);
-        auto t = std::lower_bound(first_rule, last_rule, min_year);
-        if (t > first_rule+1)
-        {
-            if (t == last_rule || t->starting_year() >= min_year)
-                --t;
-            auto d = static_cast<std::size_t>(t - first_rule);
-            rules.erase(first_rule, t);
-            e -= d;
-        }
-        first_rule = rules.begin() + static_cast<difference_type>(i);
-        last_rule = rules.begin() + static_cast<difference_type>(e);
-        t = std::upper_bound(first_rule, last_rule, max_year);
-        if (t != last_rule)
-        {
-            auto d = static_cast<std::size_t>(last_rule - t);
-            rules.erase(t, last_rule);
-            e -= d;
-        }
-        i = e;
-    }
-    rules.shrink_to_fit();
-}
-
-// Find the rule that comes chronologically before Rule r.  For multi-year rules,
-// y specifies which rules in r.  For single year rules, y is assumed to be equal
-// to the year specified by r.
-// Returns a pointer to the chronologically previous rule, and the year within
-// that rule.  If there is no previous rule, returns nullptr and year::min().
-// Preconditions:
-//     r->starting_year() <= y && y <= r->ending_year()
-static
-std::pair<const Rule*, date::year>
-find_previous_rule(const Rule* r, date::year y)
-{
-    using namespace date;
-    auto const& rules = get_tzdb().rules;
-    if (y == r->starting_year())
-    {
-        if (r == &rules.front() || r->name() != r[-1].name())
-            std::terminate();  // never called with first rule
-        --r;
-        if (y == r->starting_year())
-            return {r, y};
-        return {r, r->ending_year()};
-    }
-    if (r == &rules.front() || r->name() != r[-1].name() ||
-        r[-1].starting_year() < r->starting_year())
-    {
-        while (r < &rules.back() && r->name() == r[1].name() &&
-               r->starting_year() == r[1].starting_year())
-            ++r;
-        return {r, --y};
-    }
-    --r;
-    return {r, y};
-}
-
-// Find the rule that comes chronologically after Rule r.  For multi-year rules,
-// y specifies which rules in r.  For single year rules, y is assumed to be equal
-// to the year specified by r.
-// Returns a pointer to the chronologically next rule, and the year within
-// that rule.  If there is no next rule, return a pointer to a defaulted rule
-// and y+1.
-// Preconditions:
-//     first <= r && r < last && r->starting_year() <= y && y <= r->ending_year()
-//     [first, last) all have the same name
-static
-std::pair<const Rule*, date::year>
-find_next_rule(const Rule* first_rule, const Rule* last_rule, const Rule* r, date::year y)
-{
-    using namespace date;
-    if (y == r->ending_year())
-    {
-        if (r == last_rule-1)
-            return {nullptr, year::max()};
-        ++r;
-        if (y == r->ending_year())
-            return {r, y};
-        return {r, r->starting_year()};
-    }
-    if (r == last_rule-1 || r->ending_year() < r[1].ending_year())
-    {
-        while (r > first_rule && r->starting_year() == r[-1].starting_year())
-            --r;
-        return {r, ++y};
-    }
-    ++r;
-    return {r, y};
-}
-
-// Find the rule that comes chronologically after Rule r.  For multi-year rules,
-// y specifies which rules in r.  For single year rules, y is assumed to be equal
-// to the year specified by r.
-// Returns a pointer to the chronologically next rule, and the year within
-// that rule.  If there is no next rule, return nullptr and year::max().
-// Preconditions:
-//     r->starting_year() <= y && y <= r->ending_year()
-static
-std::pair<const Rule*, date::year>
-find_next_rule(const Rule* r, date::year y)
-{
-    using namespace date;
-    auto const& rules = get_tzdb().rules;
-    if (y == r->ending_year())
-    {
-        if (r == &rules.back() || r->name() != r[1].name())
-            return {nullptr, year::max()};
-        ++r;
-        if (y == r->ending_year())
-            return {r, y};
-        return {r, r->starting_year()};
-    }
-    if (r == &rules.back() || r->name() != r[1].name() ||
-        r->ending_year() < r[1].ending_year())
-    {
-        while (r > &rules.front() && r->name() == r[-1].name() &&
-               r->starting_year() == r[-1].starting_year())
-            --r;
-        return {r, ++y};
-    }
-    ++r;
-    return {r, y};
-}
-
-static
-const Rule*
-find_first_std_rule(const std::pair<const Rule*, const Rule*>& eqr)
-{
-    auto r = eqr.first;
-    auto ry = r->starting_year();
-    while (r->save() != std::chrono::minutes{0})
-    {
-        std::tie(r, ry) = find_next_rule(eqr.first, eqr.second, r, ry);
-        if (r == nullptr)
-            throw std::runtime_error("Could not find standard offset in rule "
-                                     + eqr.first->name());
-    }
-    return r;
-}
-
-static
-std::pair<const Rule*, date::year>
-find_rule_for_zone(const std::pair<const Rule*, const Rule*>& eqr,
-                   const date::year& y, const std::chrono::seconds& offset,
-                   const MonthDayTime& mdt)
-{
-    assert(eqr.first != nullptr);
-    assert(eqr.second != nullptr);
-
-    using namespace std::chrono;
-    using namespace date;
-    auto r = eqr.first;
-    auto ry = r->starting_year();
-    auto prev_save = minutes{0};
-    auto prev_year = year::min();
-    const Rule* prev_rule = nullptr;
-    while (r != nullptr)
-    {
-        if (mdt.compare(y, r->mdt(), ry, offset, prev_save) <= 0)
-            break;
-        prev_rule = r;
-        prev_year = ry;
-        prev_save = prev_rule->save();
-        std::tie(r, ry) = find_next_rule(eqr.first, eqr.second, r, ry);
-    }
-    return {prev_rule, prev_year};
-}
-
-static
-std::pair<const Rule*, date::year>
-find_rule_for_zone(const std::pair<const Rule*, const Rule*>& eqr,
-                   const sys_seconds& tp_utc,
-                   const local_seconds& tp_std,
-                   const local_seconds& tp_loc)
-{
-    using namespace std::chrono;
-    using namespace date;
-    auto r = eqr.first;
-    auto ry = r->starting_year();
-    auto prev_save = minutes{0};
-    auto prev_year = year::min();
-    const Rule* prev_rule = nullptr;
-    while (r != nullptr)
-    {
-        bool found = false;
-        switch (r->mdt().zone())
-        {
-        case tz::utc:
-            found = tp_utc < r->mdt().to_time_point(ry);
-            break;
-        case tz::standard:
-            found = sys_seconds{tp_std.time_since_epoch()} < r->mdt().to_time_point(ry);
-            break;
-        case tz::local:
-            found = sys_seconds{tp_loc.time_since_epoch()} < r->mdt().to_time_point(ry);
-            break;
-        }
-        if (found)
-            break;
-        prev_rule = r;
-        prev_year = ry;
-        prev_save = prev_rule->save();
-        std::tie(r, ry) = find_next_rule(eqr.first, eqr.second, r, ry);
-    }
-    return {prev_rule, prev_year};
-}
-
-static
-sys_info
-find_rule(const std::pair<const Rule*, date::year>& first_rule,
-          const std::pair<const Rule*, date::year>& last_rule,
-          const date::year& y, const std::chrono::seconds& offset,
-          const MonthDayTime& mdt, const std::chrono::minutes& initial_save,
-          const std::string& initial_abbrev)
-{
-    using namespace std::chrono;
-    using namespace date;
-    auto r = first_rule.first;
-    auto ry = first_rule.second;
-    sys_info x{sys_days(year::min()/min_day), sys_days(year::max()/max_day),
-               seconds{0}, initial_save, initial_abbrev};
-    while (r != nullptr)
-    {
-        auto tr = r->mdt().to_sys(ry, offset, x.save);
-        auto tx = mdt.to_sys(y, offset, x.save);
-        // Find last rule where tx >= tr
-        if (tx <= tr || (r == last_rule.first && ry == last_rule.second))
-        {
-            if (tx < tr && r == first_rule.first && ry == first_rule.second)
-            {
-                x.end = r->mdt().to_sys(ry, offset, x.save);
-                break;
-            }
-            if (tx < tr)
-            {
-                std::tie(r, ry) = find_previous_rule(r, ry);  // can't return nullptr for r
-                assert(r != nullptr);
-            }
-            // r != nullptr && tx >= tr (if tr were to be recomputed)
-            auto prev_save = initial_save;
-            if (!(r == first_rule.first && ry == first_rule.second))
-                prev_save = find_previous_rule(r, ry).first->save();
-            x.begin = r->mdt().to_sys(ry, offset, prev_save);
-            x.save = r->save();
-            x.abbrev = r->abbrev();
-            if (!(r == last_rule.first && ry == last_rule.second))
-            {
-                std::tie(r, ry) = find_next_rule(r, ry);  // can't return nullptr for r
-                assert(r != nullptr);
-                x.end = r->mdt().to_sys(ry, offset, x.save);
-            }
-            else
-                x.end = sys_days(year::max()/max_day);
-            break;
-        }
-        x.save = r->save();
-        std::tie(r, ry) = find_next_rule(r, ry);  // Can't return nullptr for r
-        assert(r != nullptr);
-    }
-    return x;
-}
-
-// zonelet
-
-detail::zonelet::~zonelet()
-{
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
-    using minutes = std::chrono::minutes;
-    using string = std::string;
-    if (tag_ == has_save)
-        u.save_.~minutes();
-    else
-        u.rule_.~string();
-#endif
-}
-
-detail::zonelet::zonelet()
-{
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
-    ::new(&u.rule_) std::string();
-#endif
-}
-
-detail::zonelet::zonelet(const zonelet& i)
-    : gmtoff_(i.gmtoff_)
-    , tag_(i.tag_)
-    , format_(i.format_)
-    , until_year_(i.until_year_)
-    , until_date_(i.until_date_)
-    , until_utc_(i.until_utc_)
-    , until_std_(i.until_std_)
-    , until_loc_(i.until_loc_)
-    , initial_save_(i.initial_save_)
-    , initial_abbrev_(i.initial_abbrev_)
-    , first_rule_(i.first_rule_)
-    , last_rule_(i.last_rule_)
-{
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
-    if (tag_ == has_save)
-        ::new(&u.save_) std::chrono::minutes(i.u.save_);
-    else
-        ::new(&u.rule_) std::string(i.u.rule_);
-#else
-    if (tag_ == has_save)
-        u.save_ = i.u.save_;
-    else
-        u.rule_ = i.u.rule_;
-#endif
-}
-
-#endif  // !USE_OS_TZDB
-
-// time_zone
-
-#if USE_OS_TZDB
-
-time_zone::time_zone(const std::string& s, detail::undocumented)
-    : name_(s)
-    , adjusted_(new std::once_flag{})
-{
-}
-
-enum class endian
-{
-    native = __BYTE_ORDER__,
-    little = __ORDER_LITTLE_ENDIAN__,
-    big    = __ORDER_BIG_ENDIAN__
-};
-
-static
-inline
-std::uint32_t
-reverse_bytes(std::uint32_t i)
-{
-    return
-        (i & 0xff000000u) >> 24 |
-        (i & 0x00ff0000u) >> 8 |
-        (i & 0x0000ff00u) << 8 |
-        (i & 0x000000ffu) << 24;
-}
-
-static
-inline
-std::uint64_t
-reverse_bytes(std::uint64_t i)
-{
-    return
-        (i & 0xff00000000000000ull) >> 56 |
-        (i & 0x00ff000000000000ull) >> 40 |
-        (i & 0x0000ff0000000000ull) >> 24 |
-        (i & 0x000000ff00000000ull) >> 8 |
-        (i & 0x00000000ff000000ull) << 8 |
-        (i & 0x0000000000ff0000ull) << 24 |
-        (i & 0x000000000000ff00ull) << 40 |
-        (i & 0x00000000000000ffull) << 56;
-}
-
-template <class T>
-static
-inline
-void
-maybe_reverse_bytes(T&, std::false_type)
-{
-}
-
-static
-inline
-void
-maybe_reverse_bytes(std::int32_t& t, std::true_type)
-{
-    t = static_cast<std::int32_t>(reverse_bytes(static_cast<std::uint32_t>(t)));
-}
-
-static
-inline
-void
-maybe_reverse_bytes(std::int64_t& t, std::true_type)
-{
-    t = static_cast<std::int64_t>(reverse_bytes(static_cast<std::uint64_t>(t)));
-}
-
-template <class T>
-static
-inline
-void
-maybe_reverse_bytes(T& t)
-{
-    maybe_reverse_bytes(t, std::integral_constant<bool,
-                                                  endian::native == endian::little>{});
-}
-
-static
-void
-load_header(std::istream& inf)
-{
-    // Read TZif
-    auto t = inf.get();
-    auto z = inf.get();
-    auto i = inf.get();
-    auto f = inf.get();
-#ifndef NDEBUG
-    assert(t == 'T');
-    assert(z == 'Z');
-    assert(i == 'i');
-    assert(f == 'f');
-#else
-    (void)t;
-    (void)z;
-    (void)i;
-    (void)f;
-#endif
-}
-
-static
-unsigned char
-load_version(std::istream& inf)
-{
-    // Read version
-    auto v = inf.get();
-    assert(v != EOF);
-    return static_cast<unsigned char>(v);
-}
-
-static
-void
-skip_reserve(std::istream& inf)
-{
-    inf.ignore(15);
-}
-
-static
-void
-load_counts(std::istream& inf,
-            std::int32_t& tzh_ttisgmtcnt, std::int32_t& tzh_ttisstdcnt,
-            std::int32_t& tzh_leapcnt,    std::int32_t& tzh_timecnt,
-            std::int32_t& tzh_typecnt,    std::int32_t& tzh_charcnt)
-{
-    // Read counts;
-    inf.read(reinterpret_cast<char*>(&tzh_ttisgmtcnt), 4);
-    maybe_reverse_bytes(tzh_ttisgmtcnt);
-    inf.read(reinterpret_cast<char*>(&tzh_ttisstdcnt), 4);
-    maybe_reverse_bytes(tzh_ttisstdcnt);
-    inf.read(reinterpret_cast<char*>(&tzh_leapcnt), 4);
-    maybe_reverse_bytes(tzh_leapcnt);
-    inf.read(reinterpret_cast<char*>(&tzh_timecnt), 4);
-    maybe_reverse_bytes(tzh_timecnt);
-    inf.read(reinterpret_cast<char*>(&tzh_typecnt), 4);
-    maybe_reverse_bytes(tzh_typecnt);
-    inf.read(reinterpret_cast<char*>(&tzh_charcnt), 4);
-    maybe_reverse_bytes(tzh_charcnt);
-}
-
-template <class TimeType>
-static
-std::vector<detail::transition>
-load_transitions(std::istream& inf, std::int32_t tzh_timecnt)
-{
-    // Read transitions
-    using namespace std::chrono;
-    std::vector<detail::transition> transitions;
-    transitions.reserve(static_cast<unsigned>(tzh_timecnt));
-    for (std::int32_t i = 0; i < tzh_timecnt; ++i)
-    {
-        TimeType t;
-        inf.read(reinterpret_cast<char*>(&t), sizeof(t));
-        maybe_reverse_bytes(t);
-        transitions.emplace_back(sys_seconds{seconds{t}});
-        if (transitions.back().timepoint < min_seconds)
-            transitions.back().timepoint = min_seconds;
-    }
-    return transitions;
-}
-
-static
-std::vector<std::uint8_t>
-load_indices(std::istream& inf, std::int32_t tzh_timecnt)
-{
-    // Read indices
-    std::vector<std::uint8_t> indices;
-    indices.reserve(static_cast<unsigned>(tzh_timecnt));
-    for (std::int32_t i = 0; i < tzh_timecnt; ++i)
-    {
-        std::uint8_t t;
-        inf.read(reinterpret_cast<char*>(&t), sizeof(t));
-        indices.emplace_back(t);
-    }
-    return indices;
-}
-
-static
-std::vector<ttinfo>
-load_ttinfo(std::istream& inf, std::int32_t tzh_typecnt)
-{
-    // Read ttinfo
-    std::vector<ttinfo> ttinfos;
-    ttinfos.reserve(static_cast<unsigned>(tzh_typecnt));
-    for (std::int32_t i = 0; i < tzh_typecnt; ++i)
-    {
-        ttinfo t;
-        inf.read(reinterpret_cast<char*>(&t), 6);
-        maybe_reverse_bytes(t.tt_gmtoff);
-        ttinfos.emplace_back(t);
-    }
-    return ttinfos;
-}
-
-static
-std::string
-load_abbreviations(std::istream& inf, std::int32_t tzh_charcnt)
-{
-    // Read abbreviations
-    std::string abbrev;
-    abbrev.resize(static_cast<unsigned>(tzh_charcnt), '\0');
-    inf.read(&abbrev[0], tzh_charcnt);
-    return abbrev;
-}
-
-#if !MISSING_LEAP_SECONDS
-
-template <class TimeType>
-static
-std::vector<leap_second>
-load_leaps(std::istream& inf, std::int32_t tzh_leapcnt)
-{
-    // Read tzh_leapcnt pairs
-    using namespace std::chrono;
-    std::vector<leap_second> leap_seconds;
-    leap_seconds.reserve(static_cast<std::size_t>(tzh_leapcnt));
-    for (std::int32_t i = 0; i < tzh_leapcnt; ++i)
-    {
-        TimeType     t0;
-        std::int32_t t1;
-        inf.read(reinterpret_cast<char*>(&t0), sizeof(t0));
-        inf.read(reinterpret_cast<char*>(&t1), sizeof(t1));
-        maybe_reverse_bytes(t0);
-        maybe_reverse_bytes(t1);
-        leap_seconds.emplace_back(sys_seconds{seconds{t0 - (t1-1)}},
-                                  detail::undocumented{});
-    }
-    return leap_seconds;
-}
-
-template <class TimeType>
-static
-std::vector<leap_second>
-load_leap_data(std::istream& inf,
-               std::int32_t tzh_leapcnt, std::int32_t tzh_timecnt,
-               std::int32_t tzh_typecnt, std::int32_t tzh_charcnt)
-{
-    inf.ignore(tzh_timecnt*static_cast<std::int32_t>(sizeof(TimeType)) + tzh_timecnt +
-               tzh_typecnt*6 + tzh_charcnt);
-    return load_leaps<TimeType>(inf, tzh_leapcnt);
-}
-
-static
-std::vector<leap_second>
-load_just_leaps(std::istream& inf)
-{
-    // Read tzh_leapcnt pairs
-    using namespace std::chrono;
-    load_header(inf);
-    auto v = load_version(inf);
-    std::int32_t tzh_ttisgmtcnt, tzh_ttisstdcnt, tzh_leapcnt,
-                 tzh_timecnt,    tzh_typecnt,    tzh_charcnt;
-    skip_reserve(inf);
-    load_counts(inf, tzh_ttisgmtcnt, tzh_ttisstdcnt, tzh_leapcnt,
-                     tzh_timecnt,    tzh_typecnt,    tzh_charcnt);
-    if (v == 0)
-        return load_leap_data<int32_t>(inf, tzh_leapcnt, tzh_timecnt, tzh_typecnt,
-                                       tzh_charcnt);
-#if !defined(NDEBUG)
-    inf.ignore((4+1)*tzh_timecnt + 6*tzh_typecnt + tzh_charcnt + 8*tzh_leapcnt +
-               tzh_ttisstdcnt + tzh_ttisgmtcnt);
-    load_header(inf);
-    auto v2 = load_version(inf);
-    assert(v == v2);
-    skip_reserve(inf);
-#else  // defined(NDEBUG)
-    inf.ignore((4+1)*tzh_timecnt + 6*tzh_typecnt + tzh_charcnt + 8*tzh_leapcnt +
-               tzh_ttisstdcnt + tzh_ttisgmtcnt + (4+1+15));
-#endif  // defined(NDEBUG)
-    load_counts(inf, tzh_ttisgmtcnt, tzh_ttisstdcnt, tzh_leapcnt,
-                     tzh_timecnt,    tzh_typecnt,    tzh_charcnt);
-    return load_leap_data<int64_t>(inf, tzh_leapcnt, tzh_timecnt, tzh_typecnt,
-                                   tzh_charcnt);
-}
-
-#endif  // !MISSING_LEAP_SECONDS
-
-template <class TimeType>
-void
-time_zone::load_data(std::istream& inf,
-                     std::int32_t tzh_leapcnt, std::int32_t tzh_timecnt,
-                     std::int32_t tzh_typecnt, std::int32_t tzh_charcnt)
-{
-    using namespace std::chrono;
-    transitions_ = load_transitions<TimeType>(inf, tzh_timecnt);
-    auto indices = load_indices(inf, tzh_timecnt);
-    auto infos = load_ttinfo(inf, tzh_typecnt);
-    auto abbrev = load_abbreviations(inf, tzh_charcnt);
-#if !MISSING_LEAP_SECONDS
-    auto& leap_seconds = get_tzdb_list().front().leap_seconds;
-    if (leap_seconds.empty() && tzh_leapcnt > 0)
-        leap_seconds = load_leaps<TimeType>(inf, tzh_leapcnt);
-#endif
-    ttinfos_.reserve(infos.size());
-    for (auto& info : infos)
-    {
-        ttinfos_.push_back({seconds{info.tt_gmtoff},
-                            abbrev.c_str() + info.tt_abbrind,
-                            info.tt_isdst != 0});
-    }
-    auto i = 0u;
-    if (transitions_.empty() || transitions_.front().timepoint != min_seconds)
-    {
-        transitions_.emplace(transitions_.begin(), min_seconds);
-        auto tf = std::find_if(ttinfos_.begin(), ttinfos_.end(),
-                               [](const expanded_ttinfo& ti)
-                                   {return ti.is_dst == 0;});
-        if (tf == ttinfos_.end())
-            tf = ttinfos_.begin();
-        transitions_[i].info = &*tf;
-        ++i;
-    }
-    for (auto j = 0u; i < transitions_.size(); ++i, ++j)
-        transitions_[i].info = ttinfos_.data() + indices[j];
-}
-
-void
-time_zone::init_impl()
-{
-    using namespace std;
-    using namespace std::chrono;
-    auto name = get_tz_dir() + ('/' + name_);
-    std::ifstream inf(name);
-    if (!inf.is_open())
-        throw std::runtime_error{"Unable to open " + name};
-    inf.exceptions(std::ios::failbit | std::ios::badbit);
-    load_header(inf);
-    auto v = load_version(inf);
-    std::int32_t tzh_ttisgmtcnt, tzh_ttisstdcnt, tzh_leapcnt,
-                 tzh_timecnt,    tzh_typecnt,    tzh_charcnt;
-    skip_reserve(inf);
-    load_counts(inf, tzh_ttisgmtcnt, tzh_ttisstdcnt, tzh_leapcnt,
-                     tzh_timecnt,    tzh_typecnt,    tzh_charcnt);
-    if (v == 0)
-    {
-        load_data<int32_t>(inf, tzh_leapcnt, tzh_timecnt, tzh_typecnt, tzh_charcnt);
-    }
-    else
-    {
-#if !defined(NDEBUG)
-        inf.ignore((4+1)*tzh_timecnt + 6*tzh_typecnt + tzh_charcnt + 8*tzh_leapcnt +
-                   tzh_ttisstdcnt + tzh_ttisgmtcnt);
-        load_header(inf);
-        auto v2 = load_version(inf);
-        assert(v == v2);
-        skip_reserve(inf);
-#else  // defined(NDEBUG)
-        inf.ignore((4+1)*tzh_timecnt + 6*tzh_typecnt + tzh_charcnt + 8*tzh_leapcnt +
-                   tzh_ttisstdcnt + tzh_ttisgmtcnt + (4+1+15));
-#endif  // defined(NDEBUG)
-        load_counts(inf, tzh_ttisgmtcnt, tzh_ttisstdcnt, tzh_leapcnt,
-                         tzh_timecnt,    tzh_typecnt,    tzh_charcnt);
-        load_data<int64_t>(inf, tzh_leapcnt, tzh_timecnt, tzh_typecnt, tzh_charcnt);
-    }
-#if !MISSING_LEAP_SECONDS
-    if (tzh_leapcnt > 0)
-    {
-        auto& leap_seconds = get_tzdb_list().front().leap_seconds;
-        auto itr = leap_seconds.begin();
-        auto l = itr->date();
-        seconds leap_count{0};
-        for (auto t = std::upper_bound(transitions_.begin(), transitions_.end(), l,
-                                       [](const sys_seconds& x, const transition& ct)
-                                       {
-                                           return x < ct.timepoint;
-                                       });
-                  t != transitions_.end(); ++t)
-        {
-            while (t->timepoint >= l)
-            {
-                ++leap_count;
-                if (++itr == leap_seconds.end())
-                    l = sys_days(max_year/max_day);
-                else
-                    l = itr->date() + leap_count;
-            }
-            t->timepoint -= leap_count;
-        }
-    }
-#endif  // !MISSING_LEAP_SECONDS
-    auto b = transitions_.begin();
-    auto i = transitions_.end();
-    if (i != b)
-    {
-        for (--i; i != b; --i)
-        {
-            if (i->info->offset == i[-1].info->offset &&
-                i->info->abbrev == i[-1].info->abbrev &&
-                i->info->is_dst == i[-1].info->is_dst)
-                i = transitions_.erase(i);
-        }
-    }
-}
-
-void
-time_zone::init() const
-{
-    std::call_once(*adjusted_, [this]() {const_cast<time_zone*>(this)->init_impl();});
-}
-
-sys_info
-time_zone::load_sys_info(std::vector<detail::transition>::const_iterator i) const
-{
-    using namespace std::chrono;
-    assert(!transitions_.empty());
-    assert(i != transitions_.begin());
-    sys_info r;
-    r.begin = i[-1].timepoint;
-    r.end = i != transitions_.end() ? i->timepoint :
-                                      sys_seconds(sys_days(year::max()/max_day));
-    r.offset = i[-1].info->offset;
-    r.save = i[-1].info->is_dst ? minutes{1} : minutes{0};
-    r.abbrev = i[-1].info->abbrev;
-    return r;
-}
-
-sys_info
-time_zone::get_info_impl(sys_seconds tp) const
-{
-    using namespace std;
-    init();
-    return load_sys_info(upper_bound(transitions_.begin(), transitions_.end(), tp,
-                                     [](const sys_seconds& x, const transition& t)
-                                     {
-                                         return x < t.timepoint;
-                                     }));
-}
-
-local_info
-time_zone::get_info_impl(local_seconds tp) const
-{
-    using namespace std::chrono;
-    init();
-    local_info i;
-    i.result = local_info::unique;
-    auto tr = upper_bound(transitions_.begin(), transitions_.end(), tp,
-                          [](const local_seconds& x, const transition& t)
-                          {
-                              return sys_seconds{x.time_since_epoch()} -
-                                                         t.info->offset < t.timepoint;
-                          });
-    i.first = load_sys_info(tr);
-    auto tps = sys_seconds{(tp - i.first.offset).time_since_epoch()};
-    if (tps < i.first.begin + days{1} && tr != transitions_.begin())
-    {
-        i.second = load_sys_info(--tr);
-        tps = sys_seconds{(tp - i.second.offset).time_since_epoch()};
-        if (tps < i.second.end)
-        {
-           i.result = local_info::ambiguous;
-           std::swap(i.first, i.second);
-        }
-        else
-        {
-            i.second = {};
-        }
-    }
-    else if (tps >= i.first.end && tr != transitions_.end())
-    {
-        i.second = load_sys_info(++tr);
-        tps = sys_seconds{(tp - i.second.offset).time_since_epoch()};
-        if (tps < i.second.begin)
-            i.result = local_info::nonexistent;
-        else
-            i.second = {};
-    }
-    return i;
-}
-
-std::ostream&
-operator<<(std::ostream& os, const time_zone& z)
-{
-    using namespace std::chrono;
-    z.init();
-    os << z.name_ << '\n';
-    os << "Initially:           ";
-    auto const& t = z.transitions_.front();
-    if (t.info->offset >= seconds{0})
-        os << '+';
-    os << make_time(t.info->offset);
-    if (t.info->is_dst > 0)
-        os << " daylight ";
-    else
-        os << " standard ";
-    os << t.info->abbrev << '\n';
-    for (auto i = std::next(z.transitions_.cbegin()); i < z.transitions_.cend(); ++i)
-        os << *i << '\n';
-    return os;
-}
-
-#if !MISSING_LEAP_SECONDS
-
-leap_second::leap_second(const sys_seconds& s, detail::undocumented)
-    : date_(s)
-{
-}
-
-#endif  // !MISSING_LEAP_SECONDS
-
-#else  // !USE_OS_TZDB
-
-time_zone::time_zone(const std::string& s, detail::undocumented)
-    : adjusted_(new std::once_flag{})
-{
-    try
-    {
-        using namespace date;
-        std::istringstream in(s);
-        in.exceptions(std::ios::failbit | std::ios::badbit);
-        std::string word;
-        in >> word >> name_;
-        parse_info(in);
-    }
-    catch (...)
-    {
-        std::cerr << s << '\n';
-        std::cerr << *this << '\n';
-        zonelets_.pop_back();
-        throw;
-    }
-}
-
-sys_info
-time_zone::get_info_impl(sys_seconds tp) const
-{
-    return get_info_impl(tp, static_cast<int>(tz::utc));
-}
-
-local_info
-time_zone::get_info_impl(local_seconds tp) const
-{
-    using namespace std::chrono;
-    local_info i{};
-    i.first = get_info_impl(sys_seconds{tp.time_since_epoch()}, static_cast<int>(tz::local));
-    auto tps = sys_seconds{(tp - i.first.offset).time_since_epoch()};
-    if (tps < i.first.begin)
-    {
-        i.second = std::move(i.first);
-        i.first = get_info_impl(i.second.begin - seconds{1}, static_cast<int>(tz::utc));
-        i.result = local_info::nonexistent;
-    }
-    else if (i.first.end - tps <= days{1})
-    {
-        i.second = get_info_impl(i.first.end, static_cast<int>(tz::utc));
-        tps = sys_seconds{(tp - i.second.offset).time_since_epoch()};
-        if (tps >= i.second.begin)
-            i.result = local_info::ambiguous;
-        else
-            i.second = {};
-    }
-    return i;
-}
-
-void
-time_zone::add(const std::string& s)
-{
-    try
-    {
-        std::istringstream in(s);
-        in.exceptions(std::ios::failbit | std::ios::badbit);
-        ws(in);
-        if (!in.eof() && in.peek() != '#')
-            parse_info(in);
-    }
-    catch (...)
-    {
-        std::cerr << s << '\n';
-        std::cerr << *this << '\n';
-        zonelets_.pop_back();
-        throw;
-    }
-}
-
-void
-time_zone::parse_info(std::istream& in)
-{
-    using namespace date;
-    using namespace std::chrono;
-    zonelets_.emplace_back();
-    auto& zonelet = zonelets_.back();
-    zonelet.gmtoff_ = parse_signed_time(in);
-    in >> zonelet.u.rule_;
-    if (zonelet.u.rule_ == "-")
-        zonelet.u.rule_.clear();
-    in >> zonelet.format_;
-    if (!in.eof())
-        ws(in);
-    if (in.eof() || in.peek() == '#')
-    {
-        zonelet.until_year_ = year::max();
-        zonelet.until_date_ = MonthDayTime(max_day, tz::utc);
-    }
-    else
-    {
-        int y;
-        in >> y;
-        zonelet.until_year_ = year{y};
-        in >> zonelet.until_date_;
-        zonelet.until_date_.canonicalize(zonelet.until_year_);
-    }
-    if ((zonelet.until_year_ < min_year) ||
-            (zonelets_.size() > 1 && zonelets_.end()[-2].until_year_ > max_year))
-        zonelets_.pop_back();
-}
-
-void
-time_zone::adjust_infos(const std::vector<Rule>& rules)
-{
-    using namespace std::chrono;
-    using namespace date;
-    const zonelet* prev_zonelet = nullptr;
-    for (auto& z : zonelets_)
-    {
-        std::pair<const Rule*, const Rule*> eqr{};
-        std::istringstream in;
-        in.exceptions(std::ios::failbit | std::ios::badbit);
-        // Classify info as rule-based, has save, or neither
-        if (!z.u.rule_.empty())
-        {
-            // Find out if this zonelet has a rule or a save
-            eqr = std::equal_range(rules.data(), rules.data() + rules.size(), z.u.rule_);
-            if (eqr.first == eqr.second)
-            {
-                // The rule doesn't exist.  Assume this is a save
-                try
-                {
-                    using namespace std::chrono;
-                    using string = std::string;
-                    in.str(z.u.rule_);
-                    auto tmp = duration_cast<minutes>(parse_signed_time(in));
-#if !defined(_MSC_VER) || (_MSC_VER >= 1900)
-                    z.u.rule_.~string();
-                    z.tag_ = zonelet::has_save;
-                    ::new(&z.u.save_) minutes(tmp);
-#else
-                    z.u.rule_.clear();
-                    z.tag_ = zonelet::has_save;
-                    z.u.save_ = tmp;
-#endif
-                }
-                catch (...)
-                {
-                    std::cerr << name_ << " : " << z.u.rule_ << '\n';
-                    throw;
-                }
-            }
-        }
-        else
-        {
-            // This zone::zonelet has no rule and no save
-            z.tag_ = zonelet::is_empty;
-        }
-
-        minutes final_save{0};
-        if (z.tag_ == zonelet::has_save)
-        {
-            final_save = z.u.save_;
-        }
-        else if (z.tag_ == zonelet::has_rule)
-        {
-            z.last_rule_ = find_rule_for_zone(eqr, z.until_year_, z.gmtoff_,
-                                              z.until_date_);
-            if (z.last_rule_.first != nullptr)
-                final_save = z.last_rule_.first->save();
-        }
-        z.until_utc_ = z.until_date_.to_sys(z.until_year_, z.gmtoff_, final_save);
-        z.until_std_ = local_seconds{z.until_utc_.time_since_epoch()} + z.gmtoff_;
-        z.until_loc_ = z.until_std_ + final_save;
-
-        if (z.tag_ == zonelet::has_rule)
-        {
-            if (prev_zonelet != nullptr)
-            {
-                z.first_rule_ = find_rule_for_zone(eqr, prev_zonelet->until_utc_,
-                                                        prev_zonelet->until_std_,
-                                                        prev_zonelet->until_loc_);
-                if (z.first_rule_.first != nullptr)
-                {
-                    z.initial_save_ = z.first_rule_.first->save();
-                    z.initial_abbrev_ = z.first_rule_.first->abbrev();
-                    if (z.first_rule_ != z.last_rule_)
-                    {
-                        z.first_rule_ = find_next_rule(eqr.first, eqr.second,
-                                                       z.first_rule_.first,
-                                                       z.first_rule_.second);
-                    }
-                    else
-                    {
-                        z.first_rule_ = std::make_pair(nullptr, year::min());
-                        z.last_rule_ = std::make_pair(nullptr, year::max());
-                    }
-                }
-            }
-            if (z.first_rule_.first == nullptr && z.last_rule_.first != nullptr)
-            {
-                z.first_rule_ = std::make_pair(eqr.first, eqr.first->starting_year());
-                z.initial_abbrev_ = find_first_std_rule(eqr)->abbrev();
-            }
-        }
-
-#ifndef NDEBUG
-        if (z.first_rule_.first == nullptr)
-        {
-            assert(z.first_rule_.second == year::min());
-            assert(z.last_rule_.first == nullptr);
-            assert(z.last_rule_.second == year::max());
-        }
-        else
-        {
-            assert(z.last_rule_.first != nullptr);
-        }
-#endif
-        prev_zonelet = &z;
-    }
-}
-
-static
-std::string
-format_abbrev(std::string format, const std::string& variable, std::chrono::seconds off,
-                                                               std::chrono::minutes save)
-{
-    using namespace std::chrono;
-    auto k = format.find("%s");
-    if (k != std::string::npos)
-    {
-        format.replace(k, 2, variable);
-    }
-    else
-    {
-        k = format.find('/');
-        if (k != std::string::npos)
-        {
-            if (save == minutes{0})
-                format.erase(k);
-            else
-                format.erase(0, k+1);
-        }
-        else
-        {
-            k = format.find("%z");
-            if (k != std::string::npos)
-            {
-                std::string temp;
-                if (off < seconds{0})
-                {
-                    temp = '-';
-                    off = -off;
-                }
-                else
-                    temp = '+';
-                auto h = date::floor<hours>(off);
-                off -= h;
-                if (h < hours{10})
-                    temp += '0';
-                temp += std::to_string(h.count());
-                if (off > seconds{0})
-                {
-                    auto m = date::floor<minutes>(off);
-                    off -= m;
-                    if (m < minutes{10})
-                        temp += '0';
-                    temp += std::to_string(m.count());
-                    if (off > seconds{0})
-                    {
-                        if (off < seconds{10})
-                            temp += '0';
-                        temp += std::to_string(off.count());
-                    }
-                }
-                format.replace(k, 2, temp);
-            }
-        }
-    }
-    return format;
-}
-
-sys_info
-time_zone::get_info_impl(sys_seconds tp, int tz_int) const
-{
-    using namespace std::chrono;
-    using namespace date;
-    tz timezone = static_cast<tz>(tz_int);
-    assert(timezone != tz::standard);
-    auto y = year_month_day(floor<days>(tp)).year();
-    if (y < min_year || y > max_year)
-        throw std::runtime_error("The year " + std::to_string(static_cast<int>(y)) +
-            " is out of range:[" + std::to_string(static_cast<int>(min_year)) + ", "
-                                 + std::to_string(static_cast<int>(max_year)) + "]");
-    std::call_once(*adjusted_,
-                   [this]()
-                   {
-                       const_cast<time_zone*>(this)->adjust_infos(get_tzdb().rules);
-                   });
-    auto i = std::upper_bound(zonelets_.begin(), zonelets_.end(), tp,
-        [timezone](sys_seconds t, const zonelet& zl)
-        {
-            return timezone == tz::utc ? t < zl.until_utc_ :
-                                         t < sys_seconds{zl.until_loc_.time_since_epoch()};
-        });
-
-    sys_info r{};
-    if (i != zonelets_.end())
-    {
-        if (i->tag_ == zonelet::has_save)
-        {
-            if (i != zonelets_.begin())
-                r.begin = i[-1].until_utc_;
-            else
-                r.begin = sys_days(year::min()/min_day);
-            r.end = i->until_utc_;
-            r.offset = i->gmtoff_ + i->u.save_;
-            r.save = i->u.save_;
-        }
-        else if (i->u.rule_.empty())
-        {
-            if (i != zonelets_.begin())
-                r.begin = i[-1].until_utc_;
-            else
-                r.begin = sys_days(year::min()/min_day);
-            r.end = i->until_utc_;
-            r.offset = i->gmtoff_;
-        }
-        else
-        {
-            r = find_rule(i->first_rule_, i->last_rule_, y, i->gmtoff_,
-                          MonthDayTime(local_seconds{tp.time_since_epoch()}, timezone),
-                          i->initial_save_, i->initial_abbrev_);
-            r.offset = i->gmtoff_ + r.save;
-            if (i != zonelets_.begin() && r.begin < i[-1].until_utc_)
-                r.begin = i[-1].until_utc_;
-            if (r.end > i->until_utc_)
-                r.end = i->until_utc_;
-        }
-        r.abbrev = format_abbrev(i->format_, r.abbrev, r.offset, r.save);
-        assert(r.begin < r.end);
-    }
-    return r;
-}
-
-std::ostream&
-operator<<(std::ostream& os, const time_zone& z)
-{
-    using namespace date;
-    using namespace std::chrono;
-    detail::save_ostream<char> _(os);
-    os.fill(' ');
-    os.flags(std::ios::dec | std::ios::left);
-    std::call_once(*z.adjusted_,
-                   [&z]()
-                   {
-                       const_cast<time_zone&>(z).adjust_infos(get_tzdb().rules);
-                   });
-    os.width(35);
-    os << z.name_;
-    std::string indent;
-    for (auto const& s : z.zonelets_)
-    {
-        os << indent;
-        if (s.gmtoff_ >= seconds{0})
-            os << ' ';
-        os << make_time(s.gmtoff_) << "   ";
-        os.width(15);
-        if (s.tag_ != zonelet::has_save)
-            os << s.u.rule_;
-        else
-        {
-            std::ostringstream tmp;
-            tmp << make_time(s.u.save_);
-            os <<  tmp.str();
-        }
-        os.width(8);
-        os << s.format_ << "   ";
-        os << s.until_year_ << ' ' << s.until_date_;
-        os << "   " << s.until_utc_ << " UTC";
-        os << "   " << s.until_std_ << " STD";
-        os << "   " << s.until_loc_;
-        os << "   " << make_time(s.initial_save_);
-        os << "   " << s.initial_abbrev_;
-        if (s.first_rule_.first != nullptr)
-            os << "   {" << *s.first_rule_.first << ", " << s.first_rule_.second << '}';
-        else
-            os << "   {" << "nullptr" << ", " << s.first_rule_.second << '}';
-        if (s.last_rule_.first != nullptr)
-            os << "   {" << *s.last_rule_.first << ", " << s.last_rule_.second << '}';
-        else
-            os << "   {" << "nullptr" << ", " << s.last_rule_.second << '}';
-        os << '\n';
-        if (indent.empty())
-            indent = std::string(35, ' ');
-    }
-    return os;
-}
-
-#endif  // !USE_OS_TZDB
-
-#if !MISSING_LEAP_SECONDS
-
-std::ostream&
-operator<<(std::ostream& os, const leap_second& x)
-{
-    using namespace date;
-    return os << x.date_ << "  +";
-}
-
-#endif  // !MISSING_LEAP_SECONDS
-
-#if USE_OS_TZDB
-
-# ifdef __APPLE__
-static
-std::string
-get_version()
-{
-    using namespace std;
-    auto path = get_tz_dir() + string("/+VERSION");
-    ifstream in{path};
-    string version;
-    in >> version;
-    if (in.fail())
-        throw std::runtime_error("Unable to get Timezone database version from " + path);
-    return version;
-}
-# endif
-
-static
-std::unique_ptr<tzdb>
-init_tzdb()
-{
-    std::unique_ptr<tzdb> db(new tzdb);
-
-    //Iterate through folders
-    std::queue<std::string> subfolders;
-    subfolders.emplace(get_tz_dir());
-    struct dirent* d;
-    struct stat s;
-    while (!subfolders.empty())
-    {
-        auto dirname = std::move(subfolders.front());
-        subfolders.pop();
-        auto dir = opendir(dirname.c_str());
-        if (!dir)
-            continue;
-        while ((d = readdir(dir)) != nullptr)
-        {
-            // Ignore these files:
-            if (d->d_name[0]                      == '.'    || // curdir, prevdir, hidden
-                memcmp(d->d_name, "posix", 5)     == 0      || // starts with posix
-                strcmp(d->d_name, "Factory")      == 0      ||
-                strcmp(d->d_name, "iso3166.tab")  == 0      ||
-                strcmp(d->d_name, "right")        == 0      ||
-                strcmp(d->d_name, "+VERSION")     == 0      ||
-                strcmp(d->d_name, "zone.tab")     == 0      ||
-                strcmp(d->d_name, "zone1970.tab") == 0      ||
-                strcmp(d->d_name, "tzdata.zi")    == 0      ||
-                strcmp(d->d_name, "leapseconds")  == 0      ||
-                strcmp(d->d_name, "leap-seconds.list") == 0   )
-                continue;
-            auto subname = dirname + folder_delimiter + d->d_name;
-            if(stat(subname.c_str(), &s) == 0)
-            {
-                if(S_ISDIR(s.st_mode))
-                {
-                    if(!S_ISLNK(s.st_mode))
-                    {
-                        subfolders.push(subname);
-                    }
-                }
-                else
-                {
-                    db->zones.emplace_back(subname.substr(get_tz_dir().size()+1),
-                                           detail::undocumented{});
-                }
-            }
-        }
-        closedir(dir);
-    }
-    db->zones.shrink_to_fit();
-    std::sort(db->zones.begin(), db->zones.end());
-#  if !MISSING_LEAP_SECONDS
-    std::ifstream in(get_tz_dir() + std::string(1, folder_delimiter) + "right/UTC",
-                     std::ios_base::binary);
-    if (in)
-    {
-        in.exceptions(std::ios::failbit | std::ios::badbit);
-        db->leap_seconds = load_just_leaps(in);
-    }
-    else
-    {
-        in.clear();
-        in.open(get_tz_dir() + std::string(1, folder_delimiter) +
-                "UTC", std::ios_base::binary);
-        if (!in)
-            throw std::runtime_error("Unable to extract leap second information");
-        in.exceptions(std::ios::failbit | std::ios::badbit);
-        db->leap_seconds = load_just_leaps(in);
-    }
-#  endif  // !MISSING_LEAP_SECONDS
-#  ifdef __APPLE__
-    db->version = get_version();
-#  endif
-    return db;
-}
-
-#else  // !USE_OS_TZDB
-
-// time_zone_link
-
-time_zone_link::time_zone_link(const std::string& s)
-{
-    using namespace date;
-    std::istringstream in(s);
-    in.exceptions(std::ios::failbit | std::ios::badbit);
-    std::string word;
-    in >> word >> target_ >> name_;
-}
-
-std::ostream&
-operator<<(std::ostream& os, const time_zone_link& x)
-{
-    using namespace date;
-    detail::save_ostream<char> _(os);
-    os.fill(' ');
-    os.flags(std::ios::dec | std::ios::left);
-    os.width(35);
-    return os << x.name_ << " --> " << x.target_;
-}
-
-// leap_second
-
-leap_second::leap_second(const std::string& s, detail::undocumented)
-{
-    using namespace date;
-    std::istringstream in(s);
-    in.exceptions(std::ios::failbit | std::ios::badbit);
-    std::string word;
-    int y;
-    MonthDayTime date;
-    in >> word >> y >> date;
-    date_ = date.to_time_point(year(y));
-}
-
-static
-bool
-file_exists(const std::string& filename)
-{
-#ifdef _WIN32
-    return ::_access(filename.c_str(), 0) == 0;
-#else
-    return ::access(filename.c_str(), F_OK) == 0;
-#endif
-}
-
-#if HAS_REMOTE_API
-
-// CURL tools
-
-static
-int
-curl_global()
-{
-    if (::curl_global_init(CURL_GLOBAL_DEFAULT) != 0)
-        throw std::runtime_error("CURL global initialization failed");
-    return 0;
-}
-
-namespace
-{
-
-struct curl_deleter
-{
-    void operator()(CURL* p) const
-    {
-        ::curl_easy_cleanup(p);
-    }
-};
-
-}  // unnamed namespace
-
-static
-std::unique_ptr<CURL, curl_deleter>
-curl_init()
-{
-    static const auto curl_is_now_initiailized = curl_global();
-    (void)curl_is_now_initiailized;
-    return std::unique_ptr<CURL, curl_deleter>{::curl_easy_init()};
-}
-
-static
-bool
-download_to_string(const std::string& url, std::string& str)
-{
-    str.clear();
-    auto curl = curl_init();
-    if (!curl)
-        return false;
-    std::string version;
-    curl_easy_setopt(curl.get(), CURLOPT_USERAGENT, "curl");
-    curl_easy_setopt(curl.get(), CURLOPT_URL, url.c_str());
-    curl_write_callback write_cb = [](char* contents, std::size_t size, std::size_t nmemb,
-                                      void* userp) -> std::size_t
-    {
-        auto& userstr = *static_cast<std::string*>(userp);
-        auto realsize = size * nmemb;
-        userstr.append(contents, realsize);
-        return realsize;
-    };
-    curl_easy_setopt(curl.get(), CURLOPT_WRITEFUNCTION, write_cb);
-    curl_easy_setopt(curl.get(), CURLOPT_WRITEDATA, &str);
-    curl_easy_setopt(curl.get(), CURLOPT_SSL_VERIFYPEER, false);
-    auto res = curl_easy_perform(curl.get());
-    return (res == CURLE_OK);
-}
-
-namespace
-{
-    enum class download_file_options { binary, text };
-}
-
-static
-bool
-download_to_file(const std::string& url, const std::string& local_filename,
-                 download_file_options opts, char* error_buffer)
-{
-    auto curl = curl_init();
-    if (!curl)
-        return false;
-    curl_easy_setopt(curl.get(), CURLOPT_URL, url.c_str());
-    curl_easy_setopt(curl.get(), CURLOPT_SSL_VERIFYPEER, false);
-    if (error_buffer)
-       curl_easy_setopt(curl.get(), CURLOPT_ERRORBUFFER, error_buffer);
-    curl_write_callback write_cb = [](char* contents, std::size_t size, std::size_t nmemb,
-                                      void* userp) -> std::size_t
-    {
-        auto& of = *static_cast<std::ofstream*>(userp);
-        auto realsize = size * nmemb;
-        of.write(contents, static_cast<std::streamsize>(realsize));
-        return realsize;
-    };
-    curl_easy_setopt(curl.get(), CURLOPT_WRITEFUNCTION, write_cb);
-    decltype(curl_easy_perform(curl.get())) res;
-    {
-        std::ofstream of(local_filename,
-                         opts == download_file_options::binary ?
-                             std::ofstream::out | std::ofstream::binary :
-                             std::ofstream::out);
-        of.exceptions(std::ios::badbit);
-        curl_easy_setopt(curl.get(), CURLOPT_WRITEDATA, &of);
-        res = curl_easy_perform(curl.get());
-    }
-    return res == CURLE_OK;
-}
-
-std::string
-remote_version()
-{
-    std::string version;
-    std::string str;
-    if (download_to_string("https://www.iana.org/time-zones", str))
-    {
-        CONSTDATA char db[] = "/time-zones/releases/tzdata";
-        CONSTDATA auto db_size = sizeof(db) - 1;
-        auto p = str.find(db, 0, db_size);
-        const int ver_str_len = 5;
-        if (p != std::string::npos && p + (db_size + ver_str_len) <= str.size())
-            version = str.substr(p + db_size, ver_str_len);
-    }
-    return version;
-}
-
-
-// TODO! Using system() create a process and a console window.
-// This is useful to see what errors may occur but is slow and distracting.
-// Consider implementing this functionality more directly, such as
-// using _mkdir and CreateProcess etc.
-// But use the current means now as matches Unix implementations and while
-// in proof of concept / testing phase.
-// TODO! Use <filesystem> eventually.
-static
-bool
-remove_folder_and_subfolders(const std::string& folder)
-{
-#  ifdef _WIN32
-#    if USE_SHELL_API
-    // Delete the folder contents by deleting the folder.
-    std::string cmd = "rd /s /q \"";
-    cmd += folder;
-    cmd += '\"';
-    return std::system(cmd.c_str()) == EXIT_SUCCESS;
-#    else  // !USE_SHELL_API
-    // Create a buffer containing the path to delete. It must be terminated
-    // by two nuls. Who designs these API's...
-    std::vector<char> from;
-    from.assign(folder.begin(), folder.end());
-    from.push_back('\0');
-    from.push_back('\0');
-    SHFILEOPSTRUCT fo{}; // Zero initialize.
-    fo.wFunc = FO_DELETE;
-    fo.pFrom = from.data();
-    fo.fFlags = FOF_NO_UI;
-    int ret = SHFileOperation(&fo);
-    if (ret == 0 && !fo.fAnyOperationsAborted)
-        return true;
-    return false;
-#    endif  // !USE_SHELL_API
-#  else   // !_WIN32
-#    if USE_SHELL_API
-    return std::system(("rm -R " + folder).c_str()) == EXIT_SUCCESS;
-#    else // !USE_SHELL_API
-    struct dir_deleter {
-        dir_deleter() {}
-        void operator()(DIR* d) const
-        {
-            if (d != nullptr)
-            {
-                int result = closedir(d);
-                assert(result == 0);
-            }
-        }
-    };
-    using closedir_ptr = std::unique_ptr<DIR, dir_deleter>;
-
-    std::string filename;
-    struct stat statbuf;
-    std::size_t folder_len = folder.length();
-    struct dirent* p = nullptr;
-
-    closedir_ptr d(opendir(folder.c_str()));
-    bool r = d.get() != nullptr;
-    while (r && (p=readdir(d.get())) != nullptr)
-    {
-        if (strcmp(p->d_name, ".") == 0 || strcmp(p->d_name, "..") == 0)
-           continue;
-
-        // + 2 for path delimiter and nul terminator.
-        std::size_t buf_len = folder_len + strlen(p->d_name) + 2;
-        filename.resize(buf_len);
-        std::size_t path_len = static_cast<std::size_t>(
-            snprintf(&filename[0], buf_len, "%s/%s", folder.c_str(), p->d_name));
-        assert(path_len == buf_len - 1);
-        filename.resize(path_len);
-
-        if (stat(filename.c_str(), &statbuf) == 0)
-            r = S_ISDIR(statbuf.st_mode)
-              ? remove_folder_and_subfolders(filename)
-              : unlink(filename.c_str()) == 0;
-    }
-    d.reset();
-
-    if (r)
-        r = rmdir(folder.c_str()) == 0;
-
-    return r;
-#    endif // !USE_SHELL_API
-#  endif  // !_WIN32
-}
-
-static
-bool
-make_directory(const std::string& folder)
-{
-#  ifdef _WIN32
-#    if USE_SHELL_API
-    // Re-create the folder.
-    std::string cmd = "mkdir \"";
-    cmd += folder;
-    cmd += '\"';
-    return std::system(cmd.c_str()) == EXIT_SUCCESS;
-#    else  // !USE_SHELL_API
-    return _mkdir(folder.c_str()) == 0;
-#    endif // !USE_SHELL_API
-#  else  // !_WIN32
-#    if USE_SHELL_API
-    return std::system(("mkdir -p " + folder).c_str()) == EXIT_SUCCESS;
-#    else  // !USE_SHELL_API
-    return mkdir(folder.c_str(), 0777) == 0;
-#    endif  // !USE_SHELL_API
-#  endif  // !_WIN32
-}
-
-static
-bool
-delete_file(const std::string& file)
-{
-#  ifdef _WIN32
-#    if USE_SHELL_API
-    std::string cmd = "del \"";
-    cmd += file;
-    cmd += '\"';
-    return std::system(cmd.c_str()) == 0;
-#    else  // !USE_SHELL_API
-    return _unlink(file.c_str()) == 0;
-#    endif // !USE_SHELL_API
-#  else  // !_WIN32
-#    if USE_SHELL_API
-    return std::system(("rm " + file).c_str()) == EXIT_SUCCESS;
-#    else // !USE_SHELL_API
-    return unlink(file.c_str()) == 0;
-#    endif // !USE_SHELL_API
-#  endif  // !_WIN32
-}
-
-#  ifdef _WIN32
-
-static
-bool
-move_file(const std::string& from, const std::string& to)
-{
-#    if USE_SHELL_API
-    std::string cmd = "move \"";
-    cmd += from;
-    cmd += "\" \"";
-    cmd += to;
-    cmd += '\"';
-    return std::system(cmd.c_str()) == EXIT_SUCCESS;
-#    else  // !USE_SHELL_API
-    return !!::MoveFile(from.c_str(), to.c_str());
-#    endif // !USE_SHELL_API
-}
-
-// Usually something like "c:\Program Files".
-static
-std::string
-get_program_folder()
-{
-    return get_known_folder(FOLDERID_ProgramFiles);
-}
-
-// Note folder can and usually does contain spaces.
-static
-std::string
-get_unzip_program()
-{
-    std::string path;
-
-    // 7-Zip appears to note its location in the registry.
-    // If that doesn't work, fall through and take a guess, but it will likely be wrong.
-    HKEY hKey = nullptr;
-    if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\7-Zip", 0, KEY_READ, &hKey) == ERROR_SUCCESS)
-    {
-        char value_buffer[MAX_PATH + 1]; // fyi 260 at time of writing.
-        // in/out parameter. Documentation say that size is a count of bytes not chars.
-        DWORD size = sizeof(value_buffer) - sizeof(value_buffer[0]);
-        DWORD tzi_type = REG_SZ;
-        // Testing shows Path key value is "C:\Program Files\7-Zip\" i.e. always with trailing \.
-        bool got_value = (RegQueryValueExA(hKey, "Path", nullptr, &tzi_type,
-            reinterpret_cast<LPBYTE>(value_buffer), &size) == ERROR_SUCCESS);
-        RegCloseKey(hKey); // Close now incase of throw later.
-        if (got_value)
-        {
-            // Function does not guarantee to null terminate.
-            value_buffer[size / sizeof(value_buffer[0])] = '\0';
-            path = value_buffer;
-            if (!path.empty())
-            {
-                path += "7z.exe";
-                return path;
-            }
-        }
-    }
-    path += get_program_folder();
-    path += folder_delimiter;
-    path += "7-Zip\\7z.exe";
-    return path;
-}
-
-#    if !USE_SHELL_API
-static
-int
-run_program(const std::string& command)
-{
-    STARTUPINFO si{};
-    si.cb = sizeof(si);
-    PROCESS_INFORMATION pi{};
-
-    // Allegedly CreateProcess overwrites the command line. Ugh.
-    std::string mutable_command(command);
-    if (CreateProcess(nullptr, &mutable_command[0],
-        nullptr, nullptr, FALSE, CREATE_NO_WINDOW, nullptr, nullptr, &si, &pi))
-    {
-        WaitForSingleObject(pi.hProcess, INFINITE);
-        DWORD exit_code;
-        bool got_exit_code = !!GetExitCodeProcess(pi.hProcess, &exit_code);
-        CloseHandle(pi.hProcess);
-        CloseHandle(pi.hThread);
-        // Not 100% sure about this still active thing is correct,
-        // but I'm going with it because I *think* WaitForSingleObject might
-        // return in some cases without INFINITE-ly waiting.
-        // But why/wouldn't GetExitCodeProcess return false in that case?
-        if (got_exit_code && exit_code != STILL_ACTIVE)
-            return static_cast<int>(exit_code);
-    }
-    return EXIT_FAILURE;
-}
-#    endif // !USE_SHELL_API
-
-static
-std::string
-get_download_tar_file(const std::string& version)
-{
-    auto file = get_install();
-    file += folder_delimiter;
-    file += "tzdata";
-    file += version;
-    file += ".tar";
-    return file;
-}
-
-static
-bool
-extract_gz_file(const std::string& version, const std::string& gz_file,
-                const std::string& dest_folder)
-{
-    auto unzip_prog = get_unzip_program();
-    bool unzip_result = false;
-    // Use the unzip program to extract the tar file from the archive.
-
-    // Aim to create a string like:
-    // "C:\Program Files\7-Zip\7z.exe" x "C:\Users\SomeUser\Downloads\tzdata2016d.tar.gz"
-    //     -o"C:\Users\SomeUser\Downloads\tzdata"
-    std::string cmd;
-    cmd = '\"';
-    cmd += unzip_prog;
-    cmd += "\" x \"";
-    cmd += gz_file;
-    cmd += "\" -o\"";
-    cmd += dest_folder;
-    cmd += '\"';
-
-#    if USE_SHELL_API
-    // When using shelling out with std::system() extra quotes are required around the
-    // whole command. It's weird but necessary it seems, see:
-    // http://stackoverflow.com/q/27975969/576911
-
-    cmd = "\"" + cmd + "\"";
-    if (std::system(cmd.c_str()) == EXIT_SUCCESS)
-        unzip_result = true;
-#    else  // !USE_SHELL_API
-    if (run_program(cmd) == EXIT_SUCCESS)
-        unzip_result = true;
-#    endif // !USE_SHELL_API
-    if (unzip_result)
-        delete_file(gz_file);
-
-    // Use the unzip program extract the data from the tar file that was
-    // just extracted from the archive.
-    auto tar_file = get_download_tar_file(version);
-    cmd = '\"';
-    cmd += unzip_prog;
-    cmd += "\" x \"";
-    cmd += tar_file;
-    cmd += "\" -o\"";
-    cmd += get_install();
-    cmd += '\"';
-#    if USE_SHELL_API
-    cmd = "\"" + cmd + "\"";
-    if (std::system(cmd.c_str()) == EXIT_SUCCESS)
-        unzip_result = true;
-#    else  // !USE_SHELL_API
-    if (run_program(cmd) == EXIT_SUCCESS)
-        unzip_result = true;
-#    endif // !USE_SHELL_API
-
-    if (unzip_result)
-        delete_file(tar_file);
-
-    return unzip_result;
-}
-
-static
-std::string
-get_download_mapping_file(const std::string& version)
-{
-    auto file = get_install() + version + "windowsZones.xml";
-    return file;
-}
-
-#  else  // !_WIN32
-
-#    if !USE_SHELL_API
-static
-int
-run_program(const char* prog, const char*const args[])
-{
-    pid_t pid = fork();
-    if (pid == -1) // Child failed to start.
-        return EXIT_FAILURE;
-
-    if (pid != 0)
-    {
-        // We are in the parent. Child started. Wait for it.
-        pid_t ret;
-        int status;
-        while ((ret = waitpid(pid, &status, 0)) == -1)
-        {
-            if (errno != EINTR)
-                break;
-        }
-        if (ret != -1)
-        {
-            if (WIFEXITED(status))
-                return WEXITSTATUS(status);
-        }
-        printf("Child issues!\n");
-
-        return EXIT_FAILURE; // Not sure what status of child is.
-    }
-    else // We are in the child process. Start the program the parent wants to run.
-    {
-
-        if (execv(prog, const_cast<char**>(args)) == -1) // Does not return.
-        {
-            perror("unreachable 0\n");
-            _Exit(127);
-        }
-        printf("unreachable 2\n");
-    }
-    printf("unreachable 2\n");
-    // Unreachable.
-    assert(false);
-    exit(EXIT_FAILURE);
-    return EXIT_FAILURE;
-}
-#    endif // !USE_SHELL_API
-
-static
-bool
-extract_gz_file(const std::string&, const std::string& gz_file, const std::string&)
-{
-#    if USE_SHELL_API
-    bool unzipped = std::system(("tar -xzf " + gz_file + " -C " + get_install()).c_str()) == EXIT_SUCCESS;
-#    else  // !USE_SHELL_API
-    const char prog[] = {"/usr/bin/tar"};
-    const char*const args[] =
-    {
-        prog, "-xzf", gz_file.c_str(), "-C", get_install().c_str(), nullptr
-    };
-    bool unzipped = (run_program(prog, args) == EXIT_SUCCESS);
-#    endif // !USE_SHELL_API
-    if (unzipped)
-    {
-        delete_file(gz_file);
-        return true;
-    }
-    return false;
-}
-
-#  endif // !_WIN32
-
-bool
-remote_download(const std::string& version, char* error_buffer)
-{
-    assert(!version.empty());
-
-#  ifdef _WIN32
-    // Download folder should be always available for Windows
-#  else  // !_WIN32
-    // Create download folder if it does not exist on UNIX system
-    auto download_folder = get_install();
-    if (!file_exists(download_folder))
-    {
-        if (!make_directory(download_folder))
-            return false;
-    }
-#  endif  // _WIN32
-
-    auto url = "https://data.iana.org/time-zones/releases/tzdata" + version +
-               ".tar.gz";
-    bool result = download_to_file(url, get_download_gz_file(version),
-                                   download_file_options::binary, error_buffer);
-#  ifdef _WIN32
-    if (result)
-    {
-        auto mapping_file = get_download_mapping_file(version);
-        result = download_to_file(
-			"https://raw.githubusercontent.com/unicode-org/cldr/master/"
-			"common/supplemental/windowsZones.xml",
-            mapping_file, download_file_options::text, error_buffer);
-    }
-#  endif  // _WIN32
-    return result;
-}
-
-bool
-remote_install(const std::string& version)
-{
-    auto success = false;
-    assert(!version.empty());
-
-    std::string install = get_install();
-    auto gz_file = get_download_gz_file(version);
-    if (file_exists(gz_file))
-    {
-        if (file_exists(install))
-            remove_folder_and_subfolders(install);
-        if (make_directory(install))
-        {
-            if (extract_gz_file(version, gz_file, install))
-                success = true;
-#  ifdef _WIN32
-            auto mapping_file_source = get_download_mapping_file(version);
-            auto mapping_file_dest = get_install();
-            mapping_file_dest += folder_delimiter;
-            mapping_file_dest += "windowsZones.xml";
-            if (!move_file(mapping_file_source, mapping_file_dest))
-                success = false;
-#  endif  // _WIN32
-        }
-    }
-    return success;
-}
-
-#endif  // HAS_REMOTE_API
-
-static
-std::string
-get_version(const std::string& path)
-{
-    std::string version;
-    std::ifstream infile(path + "version");
-    if (infile.is_open())
-    {
-        infile >> version;
-        if (!infile.fail())
-            return version;
-    }
-    else
-    {
-        infile.open(path + "NEWS");
-        while (infile)
-        {
-            infile >> version;
-            if (version == "Release")
-            {
-                infile >> version;
-                return version;
-            }
-        }
-    }
-    throw std::runtime_error("Unable to get Timezone database version from " + path);
-}
-
-static
-std::unique_ptr<tzdb>
-init_tzdb()
-{
-    using namespace date;
-    const std::string install = get_install();
-    const std::string path = install + folder_delimiter;
-    std::string line;
-    bool continue_zone = false;
-    std::unique_ptr<tzdb> db(new tzdb);
-
-#if AUTO_DOWNLOAD
-    if (!file_exists(install))
-    {
-        auto rv = remote_version();
-        if (!rv.empty() && remote_download(rv))
-        {
-            if (!remote_install(rv))
-            {
-                std::string msg = "Timezone database version \"";
-                msg += rv;
-                msg += "\" did not install correctly to \"";
-                msg += install;
-                msg += "\"";
-                throw std::runtime_error(msg);
-            }
-        }
-        if (!file_exists(install))
-        {
-            std::string msg = "Timezone database not found at \"";
-            msg += install;
-            msg += "\"";
-            throw std::runtime_error(msg);
-        }
-        db->version = get_version(path);
-    }
-    else
-    {
-        db->version = get_version(path);
-        auto rv = remote_version();
-        if (!rv.empty() && db->version != rv)
-        {
-            if (remote_download(rv))
-            {
-                remote_install(rv);
-                db->version = get_version(path);
-            }
-        }
-    }
-#else  // !AUTO_DOWNLOAD
-    if (!file_exists(install))
-    {
-        std::string msg = "Timezone database not found at \"";
-        msg += install;
-        msg += "\"";
-        throw std::runtime_error(msg);
-    }
-    db->version = get_version(path);
-#endif  // !AUTO_DOWNLOAD
-
-    CONSTDATA char*const files[] =
-    {
-        "africa", "antarctica", "asia", "australasia", "backward", "etcetera", "europe",
-        "pacificnew", "northamerica", "southamerica", "systemv", "leapseconds"
-    };
-
-    for (const auto& filename : files)
-    {
-        std::ifstream infile(path + filename);
-        while (infile)
-        {
-            std::getline(infile, line);
-            if (!line.empty() && line[0] != '#')
-            {
-                std::istringstream in(line);
-                std::string word;
-                in >> word;
-                if (word == "Rule")
-                {
-                    db->rules.push_back(Rule(line));
-                    continue_zone = false;
-                }
-                else if (word == "Link")
-                {
-                    db->links.push_back(time_zone_link(line));
-                    continue_zone = false;
-                }
-                else if (word == "Leap")
-                {
-                    db->leap_seconds.push_back(leap_second(line, detail::undocumented{}));
-                    continue_zone = false;
-                }
-                else if (word == "Zone")
-                {
-                    db->zones.push_back(time_zone(line, detail::undocumented{}));
-                    continue_zone = true;
-                }
-                else if (line[0] == '\t' && continue_zone)
-                {
-                    db->zones.back().add(line);
-                }
-                else
-                {
-                    std::cerr << line << '\n';
-                }
-            }
-        }
-    }
-    std::sort(db->rules.begin(), db->rules.end());
-    Rule::split_overlaps(db->rules);
-    std::sort(db->zones.begin(), db->zones.end());
-    db->zones.shrink_to_fit();
-    std::sort(db->links.begin(), db->links.end());
-    db->links.shrink_to_fit();
-    std::sort(db->leap_seconds.begin(), db->leap_seconds.end());
-    db->leap_seconds.shrink_to_fit();
-
-#ifdef _WIN32
-    std::string mapping_file = get_install() + folder_delimiter + "windowsZones.xml";
-    db->mappings = load_timezone_mappings_from_xml_file(mapping_file);
-    sort_zone_mappings(db->mappings);
-#endif // _WIN32
-
-    return db;
-}
-
-const tzdb&
-reload_tzdb()
-{
-#if AUTO_DOWNLOAD
-    auto const& v = get_tzdb_list().front().version;
-    if (!v.empty() && v == remote_version())
-        return get_tzdb_list().front();
-#endif  // AUTO_DOWNLOAD
-    tzdb_list::undocumented_helper::push_front(get_tzdb_list(), init_tzdb().release());
-    return get_tzdb_list().front();
-}
-
-#endif  // !USE_OS_TZDB
-
-const tzdb&
-get_tzdb()
-{
-    return get_tzdb_list().front();
-}
-
-const time_zone*
-#if HAS_STRING_VIEW
-tzdb::locate_zone(std::string_view tz_name) const
-#else
-tzdb::locate_zone(const std::string& tz_name) const
-#endif
-{
-    auto zi = std::lower_bound(zones.begin(), zones.end(), tz_name,
-#if HAS_STRING_VIEW
-        [](const time_zone& z, const std::string_view& nm)
-#else
-        [](const time_zone& z, const std::string& nm)
-#endif
-        {
-            return z.name() < nm;
-        });
-    if (zi == zones.end() || zi->name() != tz_name)
-    {
-#if !USE_OS_TZDB
-        auto li = std::lower_bound(links.begin(), links.end(), tz_name,
-#if HAS_STRING_VIEW
-        [](const time_zone_link& z, const std::string_view& nm)
-#else
-        [](const time_zone_link& z, const std::string& nm)
-#endif
-        {
-            return z.name() < nm;
-        });
-        if (li != links.end() && li->name() == tz_name)
-        {
-            zi = std::lower_bound(zones.begin(), zones.end(), li->target(),
-                [](const time_zone& z, const std::string& nm)
-                {
-                    return z.name() < nm;
-                });
-            if (zi != zones.end() && zi->name() == li->target())
-                return &*zi;
-        }
-#endif  // !USE_OS_TZDB
-        throw std::runtime_error(std::string(tz_name) + " not found in timezone database");
-    }
-    return &*zi;
-}
-
-const time_zone*
-#if HAS_STRING_VIEW
-locate_zone(std::string_view tz_name)
-#else
-locate_zone(const std::string& tz_name)
-#endif
-{
-    return get_tzdb().locate_zone(tz_name);
-}
-
-#if USE_OS_TZDB
-
-std::ostream&
-operator<<(std::ostream& os, const tzdb& db)
-{
-    os << "Version: " << db.version << "\n\n";
-    for (const auto& x : db.zones)
-        os << x << '\n';
-#if !MISSING_LEAP_SECONDS
-    os << '\n';
-    for (const auto& x : db.leap_seconds)
-        os << x << '\n';
-#endif  // !MISSING_LEAP_SECONDS
-    return os;
-}
-
-#else  // !USE_OS_TZDB
-
-std::ostream&
-operator<<(std::ostream& os, const tzdb& db)
-{
-    os << "Version: " << db.version << '\n';
-    std::string title("--------------------------------------------"
-                      "--------------------------------------------\n"
-                      "Name           ""Start Y ""End Y   "
-                      "Beginning                              ""Offset  "
-                      "Designator\n"
-                      "--------------------------------------------"
-                      "--------------------------------------------\n");
-    int count = 0;
-    for (const auto& x : db.rules)
-    {
-        if (count++ % 50 == 0)
-            os << title;
-        os << x << '\n';
-    }
-    os << '\n';
-    title = std::string("---------------------------------------------------------"
-                        "--------------------------------------------------------\n"
-                        "Name                               ""Offset      "
-                        "Rule           ""Abrev      ""Until\n"
-                        "---------------------------------------------------------"
-                        "--------------------------------------------------------\n");
-    count = 0;
-    for (const auto& x : db.zones)
-    {
-        if (count++ % 10 == 0)
-            os << title;
-        os << x << '\n';
-    }
-    os << '\n';
-    title = std::string("---------------------------------------------------------"
-                        "--------------------------------------------------------\n"
-                        "Alias                                   ""To\n"
-                        "---------------------------------------------------------"
-                        "--------------------------------------------------------\n");
-    count = 0;
-    for (const auto& x : db.links)
-    {
-        if (count++ % 45 == 0)
-            os << title;
-        os << x << '\n';
-    }
-    os << '\n';
-    title = std::string("---------------------------------------------------------"
-                        "--------------------------------------------------------\n"
-                        "Leap second on\n"
-                        "---------------------------------------------------------"
-                        "--------------------------------------------------------\n");
-    os << title;
-    for (const auto& x : db.leap_seconds)
-        os << x << '\n';
-    return os;
-}
-
-#endif  // !USE_OS_TZDB
-
-// -----------------------
-
-#ifdef _WIN32
-
-static
-std::string
-getTimeZoneKeyName()
-{
-    DYNAMIC_TIME_ZONE_INFORMATION dtzi{};
-    auto result = GetDynamicTimeZoneInformation(&dtzi);
-    if (result == TIME_ZONE_ID_INVALID)
-        throw std::runtime_error("current_zone(): GetDynamicTimeZoneInformation()"
-                                 " reported TIME_ZONE_ID_INVALID.");
-    auto wlen = wcslen(dtzi.TimeZoneKeyName);
-    char buf[128] = {};
-    assert(sizeof(buf) >= wlen+1);
-    wcstombs(buf, dtzi.TimeZoneKeyName, wlen);
-    if (strcmp(buf, "Coordinated Universal Time") == 0)
-        return "UTC";
-    return buf;
-}
-
-const time_zone*
-tzdb::current_zone() const
-{
-    std::string win_tzid = getTimeZoneKeyName();
-    std::string standard_tzid;
-    if (!native_to_standard_timezone_name(win_tzid, standard_tzid))
-    {
-        std::string msg;
-        msg = "current_zone() failed: A mapping from the Windows Time Zone id \"";
-        msg += win_tzid;
-        msg += "\" was not found in the time zone mapping database.";
-        throw std::runtime_error(msg);
-    }
-    return locate_zone(standard_tzid);
-}
-
-#else  // !_WIN32
-
-const time_zone*
-tzdb::current_zone() const
-{
-    // On some OS's a file called /etc/localtime may
-    // exist and it may be either a real file
-    // containing time zone details or a symlink to such a file.
-    // On MacOS and BSD Unix if this file is a symlink it
-    // might resolve to a path like this:
-    // "/usr/share/zoneinfo/America/Los_Angeles"
-    // If it does, we try to determine the current
-    // timezone from the remainder of the path by removing the prefix
-    // and hoping the rest resolves to a valid timezone.
-    // It may not always work though. If it doesn't then an
-    // exception will be thrown by local_timezone.
-    // The path may also take a relative form:
-    // "../usr/share/zoneinfo/America/Los_Angeles".
-    {
-        struct stat sb;
-        CONSTDATA auto timezone = "/etc/localtime";
-        if (lstat(timezone, &sb) == 0 && S_ISLNK(sb.st_mode) && sb.st_size > 0) {
-            using namespace std;
-            char rp[PATH_MAX+1] = {};
-            if (realpath(timezone, rp) == nullptr)
-                throw system_error(errno, system_category(), "realpath() failed");
-#if HAS_STRING_VIEW
-            string_view result = rp;
-            CONSTDATA string_view zoneinfo = "zoneinfo";
-            size_t pos = result.rfind(zoneinfo);
-            if (pos == result.npos)
-                throw runtime_error(
-                    "current_zone() failed to find \"zoneinfo\" in " + string(result));
-            pos = result.find('/', pos);
-            result.remove_prefix(pos + 1);
-#else
-            string result = rp;
-            CONSTDATA char zoneinfo[] = "zoneinfo";
-            size_t pos = result.rfind(zoneinfo);
-            if (pos == result.npos)
-                throw runtime_error(
-                    "current_zone() failed to find \"zoneinfo\" in " + result);
-            pos = result.find('/', pos);
-            result.erase(0, pos + 1);
-#endif
-            return locate_zone(result);
-        }
-    }
-    // On embedded systems e.g. buildroot with uclibc the timezone is linked
-    // into /etc/TZ which is a symlink to path like this:
-    // "/usr/share/zoneinfo/uclibc/America/Los_Angeles"
-    // If it does, we try to determine the current
-    // timezone from the remainder of the path by removing the prefix
-    // and hoping the rest resolves to valid timezone.
-    // It may not always work though. If it doesn't then an
-    // exception will be thrown by local_timezone.
-    // The path may also take a relative form:
-    // "../usr/share/zoneinfo/uclibc/America/Los_Angeles".
-    {
-        struct stat sb;
-        CONSTDATA auto timezone = "/etc/TZ";
-        if (lstat(timezone, &sb) == 0 && S_ISLNK(sb.st_mode) && sb.st_size > 0) {
-            using namespace std;
-            string result;
-            char rp[PATH_MAX+1] = {};
-            if (readlink(timezone, rp, sizeof(rp)-1) > 0)
-                result = string(rp);
-            else
-                throw system_error(errno, system_category(), "readlink() failed");
-
-            const size_t pos = result.find(get_tz_dir());
-            if (pos != result.npos)
-                result.erase(0, get_tz_dir().size() + 1 + pos);
-            return locate_zone(result);
-        }
-    }
-    {
-    // On some versions of some linux distro's (e.g. Ubuntu),
-    // the current timezone might be in the first line of
-    // the /etc/timezone file.
-        std::ifstream timezone_file("/etc/timezone");
-        if (timezone_file.is_open())
-        {
-            std::string result;
-            std::getline(timezone_file, result);
-            if (!result.empty())
-                return locate_zone(result);
-        }
-        // Fall through to try other means.
-    }
-    {
-    // On some versions of some bsd distro's (e.g. FreeBSD),
-    // the current timezone might be in the first line of
-    // the /var/db/zoneinfo file.
-        std::ifstream timezone_file("/var/db/zoneinfo");
-        if (timezone_file.is_open())
-        {
-            std::string result;
-            std::getline(timezone_file, result);
-            if (!result.empty())
-                return locate_zone(result);
-        }
-        // Fall through to try other means.
-    }
-    {
-    // On some versions of some bsd distro's (e.g. iOS),
-    // it is not possible to use file based approach,
-    // we switch to system API, calling functions in
-    // CoreFoundation framework.
-#if TARGET_OS_IPHONE
-        std::string result = date::iOSUtils::get_current_timezone();
-        if (!result.empty())
-            return locate_zone(result);
-#endif
-    // Fall through to try other means.
-    }
-    {
-    // On some versions of some linux distro's (e.g. Red Hat),
-    // the current timezone might be in the first line of
-    // the /etc/sysconfig/clock file as:
-    // ZONE="US/Eastern"
-        std::ifstream timezone_file("/etc/sysconfig/clock");
-        std::string result;
-        while (timezone_file)
-        {
-            std::getline(timezone_file, result);
-            auto p = result.find("ZONE=\"");
-            if (p != std::string::npos)
-            {
-                result.erase(p, p+6);
-                result.erase(result.rfind('"'));
-                return locate_zone(result);
-            }
-        }
-        // Fall through to try other means.
-    }
-    throw std::runtime_error("Could not get current timezone");
-}
-
-#endif  // !_WIN32
-
-const time_zone*
-current_zone()
-{
-    return get_tzdb().current_zone();
-}
-
-}  // namespace date
-
-#if defined(__GNUC__) && __GNUC__ < 5
-# pragma GCC diagnostic pop
-#endif