Coverage Report

Created: 2025-10-13 06:24

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/spdlog/include/spdlog/fmt/bundled/format-inl.h
Line
Count
Source
1
// Formatting library for C++ - implementation
2
//
3
// Copyright (c) 2012 - 2016, Victor Zverovich
4
// All rights reserved.
5
//
6
// For the license information refer to format.h.
7
8
#ifndef FMT_FORMAT_INL_H_
9
#define FMT_FORMAT_INL_H_
10
11
#ifndef FMT_MODULE
12
#  include <algorithm>
13
#  include <cerrno>  // errno
14
#  include <climits>
15
#  include <cmath>
16
#  include <exception>
17
#endif
18
19
#if defined(_WIN32) && !defined(FMT_USE_WRITE_CONSOLE)
20
#  include <io.h>  // _isatty
21
#endif
22
23
#include "format.h"
24
25
#if FMT_USE_LOCALE && !defined(FMT_MODULE)
26
#  include <locale>
27
#endif
28
29
#ifndef FMT_FUNC
30
#  define FMT_FUNC
31
#endif
32
33
FMT_BEGIN_NAMESPACE
34
35
#ifndef FMT_CUSTOM_ASSERT_FAIL
36
0
FMT_FUNC void assert_fail(const char* file, int line, const char* message) {
37
  // Use unchecked std::fprintf to avoid triggering another assertion when
38
  // writing to stderr fails.
39
0
  fprintf(stderr, "%s:%d: assertion failed: %s", file, line, message);
40
0
  abort();
41
0
}
42
#endif
43
44
#if FMT_USE_LOCALE
45
namespace detail {
46
using std::locale;
47
using std::numpunct;
48
using std::use_facet;
49
}  // namespace detail
50
51
template <typename Locale, enable_if_t<(sizeof(Locale::collate) != 0), int>>
52
locale_ref::locale_ref(const Locale& loc) : locale_(&loc) {
53
  static_assert(std::is_same<Locale, std::locale>::value, "");
54
}
55
#else
56
namespace detail {
57
struct locale {};
58
template <typename Char> struct numpunct {
59
  auto grouping() const -> std::string { return "\03"; }
60
  auto thousands_sep() const -> Char { return ','; }
61
  auto decimal_point() const -> Char { return '.'; }
62
};
63
template <typename Facet> Facet use_facet(locale) { return {}; }
64
}  // namespace detail
65
#endif  // FMT_USE_LOCALE
66
67
30.1k
template <typename Locale> auto locale_ref::get() const -> Locale {
68
30.1k
  using namespace detail;
69
30.1k
  static_assert(std::is_same<Locale, locale>::value, "");
70
30.1k
#if FMT_USE_LOCALE
71
30.1k
  if (locale_) return *static_cast<const locale*>(locale_);
72
30.1k
#endif
73
30.1k
  return locale();
74
30.1k
}
75
76
namespace detail {
77
78
FMT_FUNC void format_error_code(detail::buffer<char>& out, int error_code,
79
0
                                string_view message) noexcept {
80
  // Report error code making sure that the output fits into
81
  // inline_buffer_size to avoid dynamic memory allocation and potential
82
  // bad_alloc.
83
0
  out.try_resize(0);
84
0
  static const char SEP[] = ": ";
85
0
  static const char ERROR_STR[] = "error ";
86
  // Subtract 2 to account for terminating null characters in SEP and ERROR_STR.
87
0
  size_t error_code_size = sizeof(SEP) + sizeof(ERROR_STR) - 2;
88
0
  auto abs_value = static_cast<uint32_or_64_or_128_t<int>>(error_code);
89
0
  if (detail::is_negative(error_code)) {
90
0
    abs_value = 0 - abs_value;
91
0
    ++error_code_size;
92
0
  }
93
0
  error_code_size += detail::to_unsigned(detail::count_digits(abs_value));
94
0
  auto it = appender(out);
95
0
  if (message.size() <= inline_buffer_size - error_code_size)
96
0
    fmt::format_to(it, FMT_STRING("{}{}"), message, SEP);
97
0
  fmt::format_to(it, FMT_STRING("{}{}"), ERROR_STR, error_code);
98
0
  FMT_ASSERT(out.size() <= inline_buffer_size, "");
99
0
}
100
101
FMT_FUNC void do_report_error(format_func func, int error_code,
102
0
                              const char* message) noexcept {
103
0
  memory_buffer full_message;
104
0
  func(full_message, error_code, message);
105
0
  // Don't use fwrite_all because the latter may throw.
106
0
  if (std::fwrite(full_message.data(), full_message.size(), 1, stderr) > 0)
107
0
    std::fputc('\n', stderr);
108
0
}
109
110
// A wrapper around fwrite that throws on error.
111
0
inline void fwrite_all(const void* ptr, size_t count, FILE* stream) {
112
0
  size_t written = std::fwrite(ptr, 1, count, stream);
113
0
  if (written < count)
114
0
    FMT_THROW(system_error(errno, FMT_STRING("cannot write to file")));
115
0
}
116
117
template <typename Char>
118
0
FMT_FUNC auto thousands_sep_impl(locale_ref loc) -> thousands_sep_result<Char> {
119
0
  auto&& facet = use_facet<numpunct<Char>>(loc.get<locale>());
120
0
  auto grouping = facet.grouping();
121
0
  auto thousands_sep = grouping.empty() ? Char() : facet.thousands_sep();
122
0
  return {std::move(grouping), thousands_sep};
123
0
}
Unexecuted instantiation: fmt::v12::detail::thousands_sep_result<char> fmt::v12::detail::thousands_sep_impl<char>(fmt::v12::locale_ref)
Unexecuted instantiation: fmt::v12::detail::thousands_sep_result<wchar_t> fmt::v12::detail::thousands_sep_impl<wchar_t>(fmt::v12::locale_ref)
124
template <typename Char>
125
0
FMT_FUNC auto decimal_point_impl(locale_ref loc) -> Char {
126
0
  return use_facet<numpunct<Char>>(loc.get<locale>()).decimal_point();
127
0
}
Unexecuted instantiation: char fmt::v12::detail::decimal_point_impl<char>(fmt::v12::locale_ref)
Unexecuted instantiation: wchar_t fmt::v12::detail::decimal_point_impl<wchar_t>(fmt::v12::locale_ref)
128
129
#if FMT_USE_LOCALE
130
FMT_FUNC auto write_loc(appender out, loc_value value,
131
30.1k
                        const format_specs& specs, locale_ref loc) -> bool {
132
30.1k
  auto locale = loc.get<std::locale>();
133
  // We cannot use the num_put<char> facet because it may produce output in
134
  // a wrong encoding.
135
30.1k
  using facet = format_facet<std::locale>;
136
30.1k
  if (std::has_facet<facet>(locale))
137
0
    return use_facet<facet>(locale).put(out, value, specs);
138
30.1k
  return facet(locale).put(out, value, specs);
139
30.1k
}
140
#endif
141
}  // namespace detail
142
143
21.8k
FMT_FUNC void report_error(const char* message) {
144
#if FMT_MSC_VERSION || defined(__NVCC__)
145
  // Silence unreachable code warnings in MSVC and NVCC because these
146
  // are nearly impossible to fix in a generic code.
147
  volatile bool b = true;
148
  if (!b) return;
149
#endif
150
21.8k
  FMT_THROW(format_error(message));
151
21.8k
}
152
153
template <typename Locale> typename Locale::id format_facet<Locale>::id;
154
155
30.1k
template <typename Locale> format_facet<Locale>::format_facet(Locale& loc) {
156
30.1k
  auto& np = detail::use_facet<detail::numpunct<char>>(loc);
157
30.1k
  grouping_ = np.grouping();
158
30.1k
  if (!grouping_.empty()) separator_ = std::string(1, np.thousands_sep());
159
30.1k
}
160
161
#if FMT_USE_LOCALE
162
template <>
163
FMT_API FMT_FUNC auto format_facet<std::locale>::do_put(
164
30.1k
    appender out, loc_value val, const format_specs& specs) const -> bool {
165
30.1k
  return val.visit(
166
30.1k
      detail::loc_writer<>{out, specs, separator_, grouping_, decimal_point_});
167
30.1k
}
168
#endif
169
170
FMT_FUNC auto vsystem_error(int error_code, string_view fmt, format_args args)
171
0
    -> std::system_error {
172
0
  auto ec = std::error_code(error_code, std::generic_category());
173
0
  return std::system_error(ec, vformat(fmt, args));
174
0
}
175
176
namespace detail {
177
178
template <typename F>
179
inline auto operator==(basic_fp<F> x, basic_fp<F> y) -> bool {
180
  return x.f == y.f && x.e == y.e;
181
}
182
183
// Compilers should be able to optimize this into the ror instruction.
184
0
FMT_INLINE auto rotr(uint32_t n, uint32_t r) noexcept -> uint32_t {
185
0
  r &= 31;
186
0
  return (n >> r) | (n << (32 - r));
187
0
}
188
0
FMT_INLINE auto rotr(uint64_t n, uint32_t r) noexcept -> uint64_t {
189
0
  r &= 63;
190
0
  return (n >> r) | (n << (64 - r));
191
0
}
192
193
// Implementation of Dragonbox algorithm: https://github.com/jk-jeon/dragonbox.
194
namespace dragonbox {
195
// Computes upper 64 bits of multiplication of a 32-bit unsigned integer and a
196
// 64-bit unsigned integer.
197
0
inline auto umul96_upper64(uint32_t x, uint64_t y) noexcept -> uint64_t {
198
0
  return umul128_upper64(static_cast<uint64_t>(x) << 32, y);
199
0
}
200
201
// Computes lower 128 bits of multiplication of a 64-bit unsigned integer and a
202
// 128-bit unsigned integer.
203
inline auto umul192_lower128(uint64_t x, uint128_fallback y) noexcept
204
0
    -> uint128_fallback {
205
0
  uint64_t high = x * y.high();
206
0
  uint128_fallback high_low = umul128(x, y.low());
207
0
  return {high + high_low.high(), high_low.low()};
208
0
}
209
210
// Computes lower 64 bits of multiplication of a 32-bit unsigned integer and a
211
// 64-bit unsigned integer.
212
0
inline auto umul96_lower64(uint32_t x, uint64_t y) noexcept -> uint64_t {
213
0
  return x * y;
214
0
}
215
216
// Various fast log computations.
217
0
inline auto floor_log10_pow2_minus_log10_4_over_3(int e) noexcept -> int {
218
0
  FMT_ASSERT(e <= 2936 && e >= -2985, "too large exponent");
219
0
  return (e * 631305 - 261663) >> 21;
220
0
}
221
222
FMT_INLINE_VARIABLE constexpr struct div_small_pow10_infos_struct {
223
  uint32_t divisor;
224
  int shift_amount;
225
} div_small_pow10_infos[] = {{10, 16}, {100, 16}};
226
227
// Replaces n by floor(n / pow(10, N)) returning true if and only if n is
228
// divisible by pow(10, N).
229
// Precondition: n <= pow(10, N + 1).
230
template <int N>
231
0
auto check_divisibility_and_divide_by_pow10(uint32_t& n) noexcept -> bool {
232
  // The numbers below are chosen such that:
233
  //   1. floor(n/d) = floor(nm / 2^k) where d=10 or d=100,
234
  //   2. nm mod 2^k < m if and only if n is divisible by d,
235
  // where m is magic_number, k is shift_amount
236
  // and d is divisor.
237
  //
238
  // Item 1 is a common technique of replacing division by a constant with
239
  // multiplication, see e.g. "Division by Invariant Integers Using
240
  // Multiplication" by Granlund and Montgomery (1994). magic_number (m) is set
241
  // to ceil(2^k/d) for large enough k.
242
  // The idea for item 2 originates from Schubfach.
243
0
  constexpr auto info = div_small_pow10_infos[N - 1];
244
0
  FMT_ASSERT(n <= info.divisor * 10, "n is too large");
245
0
  constexpr uint32_t magic_number =
246
0
      (1u << info.shift_amount) / info.divisor + 1;
247
0
  n *= magic_number;
248
0
  const uint32_t comparison_mask = (1u << info.shift_amount) - 1;
249
0
  bool result = (n & comparison_mask) < magic_number;
250
0
  n >>= info.shift_amount;
251
0
  return result;
252
0
}
Unexecuted instantiation: bool fmt::v12::detail::dragonbox::check_divisibility_and_divide_by_pow10<1>(unsigned int&)
Unexecuted instantiation: bool fmt::v12::detail::dragonbox::check_divisibility_and_divide_by_pow10<2>(unsigned int&)
253
254
// Computes floor(n / pow(10, N)) for small n and N.
255
// Precondition: n <= pow(10, N + 1).
256
template <int N> auto small_division_by_pow10(uint32_t n) noexcept -> uint32_t {
257
  constexpr auto info = div_small_pow10_infos[N - 1];
258
  FMT_ASSERT(n <= info.divisor * 10, "n is too large");
259
  constexpr uint32_t magic_number =
260
      (1u << info.shift_amount) / info.divisor + 1;
261
  return (n * magic_number) >> info.shift_amount;
262
}
263
264
// Computes floor(n / 10^(kappa + 1)) (float)
265
0
inline auto divide_by_10_to_kappa_plus_1(uint32_t n) noexcept -> uint32_t {
266
  // 1374389535 = ceil(2^37/100)
267
0
  return static_cast<uint32_t>((static_cast<uint64_t>(n) * 1374389535) >> 37);
268
0
}
269
// Computes floor(n / 10^(kappa + 1)) (double)
270
0
inline auto divide_by_10_to_kappa_plus_1(uint64_t n) noexcept -> uint64_t {
271
  // 2361183241434822607 = ceil(2^(64+7)/1000)
272
0
  return umul128_upper64(n, 2361183241434822607ull) >> 7;
273
0
}
274
275
// Various subroutines using pow10 cache
276
template <typename T> struct cache_accessor;
277
278
template <> struct cache_accessor<float> {
279
  using carrier_uint = float_info<float>::carrier_uint;
280
  using cache_entry_type = uint64_t;
281
282
0
  static auto get_cached_power(int k) noexcept -> uint64_t {
283
0
    FMT_ASSERT(k >= float_info<float>::min_k && k <= float_info<float>::max_k,
284
0
               "k is out of range");
285
0
    static constexpr uint64_t pow10_significands[] = {
286
0
        0x81ceb32c4b43fcf5, 0xa2425ff75e14fc32, 0xcad2f7f5359a3b3f,
287
0
        0xfd87b5f28300ca0e, 0x9e74d1b791e07e49, 0xc612062576589ddb,
288
0
        0xf79687aed3eec552, 0x9abe14cd44753b53, 0xc16d9a0095928a28,
289
0
        0xf1c90080baf72cb2, 0x971da05074da7bef, 0xbce5086492111aeb,
290
0
        0xec1e4a7db69561a6, 0x9392ee8e921d5d08, 0xb877aa3236a4b44a,
291
0
        0xe69594bec44de15c, 0x901d7cf73ab0acda, 0xb424dc35095cd810,
292
0
        0xe12e13424bb40e14, 0x8cbccc096f5088cc, 0xafebff0bcb24aaff,
293
0
        0xdbe6fecebdedd5bf, 0x89705f4136b4a598, 0xabcc77118461cefd,
294
0
        0xd6bf94d5e57a42bd, 0x8637bd05af6c69b6, 0xa7c5ac471b478424,
295
0
        0xd1b71758e219652c, 0x83126e978d4fdf3c, 0xa3d70a3d70a3d70b,
296
0
        0xcccccccccccccccd, 0x8000000000000000, 0xa000000000000000,
297
0
        0xc800000000000000, 0xfa00000000000000, 0x9c40000000000000,
298
0
        0xc350000000000000, 0xf424000000000000, 0x9896800000000000,
299
0
        0xbebc200000000000, 0xee6b280000000000, 0x9502f90000000000,
300
0
        0xba43b74000000000, 0xe8d4a51000000000, 0x9184e72a00000000,
301
0
        0xb5e620f480000000, 0xe35fa931a0000000, 0x8e1bc9bf04000000,
302
0
        0xb1a2bc2ec5000000, 0xde0b6b3a76400000, 0x8ac7230489e80000,
303
0
        0xad78ebc5ac620000, 0xd8d726b7177a8000, 0x878678326eac9000,
304
0
        0xa968163f0a57b400, 0xd3c21bcecceda100, 0x84595161401484a0,
305
0
        0xa56fa5b99019a5c8, 0xcecb8f27f4200f3a, 0x813f3978f8940985,
306
0
        0xa18f07d736b90be6, 0xc9f2c9cd04674edf, 0xfc6f7c4045812297,
307
0
        0x9dc5ada82b70b59e, 0xc5371912364ce306, 0xf684df56c3e01bc7,
308
0
        0x9a130b963a6c115d, 0xc097ce7bc90715b4, 0xf0bdc21abb48db21,
309
0
        0x96769950b50d88f5, 0xbc143fa4e250eb32, 0xeb194f8e1ae525fe,
310
0
        0x92efd1b8d0cf37bf, 0xb7abc627050305ae, 0xe596b7b0c643c71a,
311
0
        0x8f7e32ce7bea5c70, 0xb35dbf821ae4f38c, 0xe0352f62a19e306f};
312
0
    return pow10_significands[k - float_info<float>::min_k];
313
0
  }
314
315
  struct compute_mul_result {
316
    carrier_uint result;
317
    bool is_integer;
318
  };
319
  struct compute_mul_parity_result {
320
    bool parity;
321
    bool is_integer;
322
  };
323
324
  static auto compute_mul(carrier_uint u,
325
                          const cache_entry_type& cache) noexcept
326
0
      -> compute_mul_result {
327
0
    auto r = umul96_upper64(u, cache);
328
0
    return {static_cast<carrier_uint>(r >> 32),
329
0
            static_cast<carrier_uint>(r) == 0};
330
0
  }
331
332
  static auto compute_delta(const cache_entry_type& cache, int beta) noexcept
333
0
      -> uint32_t {
334
0
    return static_cast<uint32_t>(cache >> (64 - 1 - beta));
335
0
  }
336
337
  static auto compute_mul_parity(carrier_uint two_f,
338
                                 const cache_entry_type& cache,
339
                                 int beta) noexcept
340
0
      -> compute_mul_parity_result {
341
0
    FMT_ASSERT(beta >= 1, "");
342
0
    FMT_ASSERT(beta < 64, "");
343
344
0
    auto r = umul96_lower64(two_f, cache);
345
0
    return {((r >> (64 - beta)) & 1) != 0,
346
0
            static_cast<uint32_t>(r >> (32 - beta)) == 0};
347
0
  }
348
349
  static auto compute_left_endpoint_for_shorter_interval_case(
350
0
      const cache_entry_type& cache, int beta) noexcept -> carrier_uint {
351
0
    return static_cast<carrier_uint>(
352
0
        (cache - (cache >> (num_significand_bits<float>() + 2))) >>
353
0
        (64 - num_significand_bits<float>() - 1 - beta));
354
0
  }
355
356
  static auto compute_right_endpoint_for_shorter_interval_case(
357
0
      const cache_entry_type& cache, int beta) noexcept -> carrier_uint {
358
0
    return static_cast<carrier_uint>(
359
0
        (cache + (cache >> (num_significand_bits<float>() + 1))) >>
360
0
        (64 - num_significand_bits<float>() - 1 - beta));
361
0
  }
362
363
  static auto compute_round_up_for_shorter_interval_case(
364
0
      const cache_entry_type& cache, int beta) noexcept -> carrier_uint {
365
0
    return (static_cast<carrier_uint>(
366
0
                cache >> (64 - num_significand_bits<float>() - 2 - beta)) +
367
0
            1) /
368
0
           2;
369
0
  }
370
};
371
372
template <> struct cache_accessor<double> {
373
  using carrier_uint = float_info<double>::carrier_uint;
374
  using cache_entry_type = uint128_fallback;
375
376
0
  static auto get_cached_power(int k) noexcept -> uint128_fallback {
377
0
    FMT_ASSERT(k >= float_info<double>::min_k && k <= float_info<double>::max_k,
378
0
               "k is out of range");
379
380
0
    static constexpr uint128_fallback pow10_significands[] = {
381
#if FMT_USE_FULL_CACHE_DRAGONBOX
382
      {0xff77b1fcbebcdc4f, 0x25e8e89c13bb0f7b},
383
      {0x9faacf3df73609b1, 0x77b191618c54e9ad},
384
      {0xc795830d75038c1d, 0xd59df5b9ef6a2418},
385
      {0xf97ae3d0d2446f25, 0x4b0573286b44ad1e},
386
      {0x9becce62836ac577, 0x4ee367f9430aec33},
387
      {0xc2e801fb244576d5, 0x229c41f793cda740},
388
      {0xf3a20279ed56d48a, 0x6b43527578c11110},
389
      {0x9845418c345644d6, 0x830a13896b78aaaa},
390
      {0xbe5691ef416bd60c, 0x23cc986bc656d554},
391
      {0xedec366b11c6cb8f, 0x2cbfbe86b7ec8aa9},
392
      {0x94b3a202eb1c3f39, 0x7bf7d71432f3d6aa},
393
      {0xb9e08a83a5e34f07, 0xdaf5ccd93fb0cc54},
394
      {0xe858ad248f5c22c9, 0xd1b3400f8f9cff69},
395
      {0x91376c36d99995be, 0x23100809b9c21fa2},
396
      {0xb58547448ffffb2d, 0xabd40a0c2832a78b},
397
      {0xe2e69915b3fff9f9, 0x16c90c8f323f516d},
398
      {0x8dd01fad907ffc3b, 0xae3da7d97f6792e4},
399
      {0xb1442798f49ffb4a, 0x99cd11cfdf41779d},
400
      {0xdd95317f31c7fa1d, 0x40405643d711d584},
401
      {0x8a7d3eef7f1cfc52, 0x482835ea666b2573},
402
      {0xad1c8eab5ee43b66, 0xda3243650005eed0},
403
      {0xd863b256369d4a40, 0x90bed43e40076a83},
404
      {0x873e4f75e2224e68, 0x5a7744a6e804a292},
405
      {0xa90de3535aaae202, 0x711515d0a205cb37},
406
      {0xd3515c2831559a83, 0x0d5a5b44ca873e04},
407
      {0x8412d9991ed58091, 0xe858790afe9486c3},
408
      {0xa5178fff668ae0b6, 0x626e974dbe39a873},
409
      {0xce5d73ff402d98e3, 0xfb0a3d212dc81290},
410
      {0x80fa687f881c7f8e, 0x7ce66634bc9d0b9a},
411
      {0xa139029f6a239f72, 0x1c1fffc1ebc44e81},
412
      {0xc987434744ac874e, 0xa327ffb266b56221},
413
      {0xfbe9141915d7a922, 0x4bf1ff9f0062baa9},
414
      {0x9d71ac8fada6c9b5, 0x6f773fc3603db4aa},
415
      {0xc4ce17b399107c22, 0xcb550fb4384d21d4},
416
      {0xf6019da07f549b2b, 0x7e2a53a146606a49},
417
      {0x99c102844f94e0fb, 0x2eda7444cbfc426e},
418
      {0xc0314325637a1939, 0xfa911155fefb5309},
419
      {0xf03d93eebc589f88, 0x793555ab7eba27cb},
420
      {0x96267c7535b763b5, 0x4bc1558b2f3458df},
421
      {0xbbb01b9283253ca2, 0x9eb1aaedfb016f17},
422
      {0xea9c227723ee8bcb, 0x465e15a979c1cadd},
423
      {0x92a1958a7675175f, 0x0bfacd89ec191eca},
424
      {0xb749faed14125d36, 0xcef980ec671f667c},
425
      {0xe51c79a85916f484, 0x82b7e12780e7401b},
426
      {0x8f31cc0937ae58d2, 0xd1b2ecb8b0908811},
427
      {0xb2fe3f0b8599ef07, 0x861fa7e6dcb4aa16},
428
      {0xdfbdcece67006ac9, 0x67a791e093e1d49b},
429
      {0x8bd6a141006042bd, 0xe0c8bb2c5c6d24e1},
430
      {0xaecc49914078536d, 0x58fae9f773886e19},
431
      {0xda7f5bf590966848, 0xaf39a475506a899f},
432
      {0x888f99797a5e012d, 0x6d8406c952429604},
433
      {0xaab37fd7d8f58178, 0xc8e5087ba6d33b84},
434
      {0xd5605fcdcf32e1d6, 0xfb1e4a9a90880a65},
435
      {0x855c3be0a17fcd26, 0x5cf2eea09a550680},
436
      {0xa6b34ad8c9dfc06f, 0xf42faa48c0ea481f},
437
      {0xd0601d8efc57b08b, 0xf13b94daf124da27},
438
      {0x823c12795db6ce57, 0x76c53d08d6b70859},
439
      {0xa2cb1717b52481ed, 0x54768c4b0c64ca6f},
440
      {0xcb7ddcdda26da268, 0xa9942f5dcf7dfd0a},
441
      {0xfe5d54150b090b02, 0xd3f93b35435d7c4d},
442
      {0x9efa548d26e5a6e1, 0xc47bc5014a1a6db0},
443
      {0xc6b8e9b0709f109a, 0x359ab6419ca1091c},
444
      {0xf867241c8cc6d4c0, 0xc30163d203c94b63},
445
      {0x9b407691d7fc44f8, 0x79e0de63425dcf1e},
446
      {0xc21094364dfb5636, 0x985915fc12f542e5},
447
      {0xf294b943e17a2bc4, 0x3e6f5b7b17b2939e},
448
      {0x979cf3ca6cec5b5a, 0xa705992ceecf9c43},
449
      {0xbd8430bd08277231, 0x50c6ff782a838354},
450
      {0xece53cec4a314ebd, 0xa4f8bf5635246429},
451
      {0x940f4613ae5ed136, 0x871b7795e136be9a},
452
      {0xb913179899f68584, 0x28e2557b59846e40},
453
      {0xe757dd7ec07426e5, 0x331aeada2fe589d0},
454
      {0x9096ea6f3848984f, 0x3ff0d2c85def7622},
455
      {0xb4bca50b065abe63, 0x0fed077a756b53aa},
456
      {0xe1ebce4dc7f16dfb, 0xd3e8495912c62895},
457
      {0x8d3360f09cf6e4bd, 0x64712dd7abbbd95d},
458
      {0xb080392cc4349dec, 0xbd8d794d96aacfb4},
459
      {0xdca04777f541c567, 0xecf0d7a0fc5583a1},
460
      {0x89e42caaf9491b60, 0xf41686c49db57245},
461
      {0xac5d37d5b79b6239, 0x311c2875c522ced6},
462
      {0xd77485cb25823ac7, 0x7d633293366b828c},
463
      {0x86a8d39ef77164bc, 0xae5dff9c02033198},
464
      {0xa8530886b54dbdeb, 0xd9f57f830283fdfd},
465
      {0xd267caa862a12d66, 0xd072df63c324fd7c},
466
      {0x8380dea93da4bc60, 0x4247cb9e59f71e6e},
467
      {0xa46116538d0deb78, 0x52d9be85f074e609},
468
      {0xcd795be870516656, 0x67902e276c921f8c},
469
      {0x806bd9714632dff6, 0x00ba1cd8a3db53b7},
470
      {0xa086cfcd97bf97f3, 0x80e8a40eccd228a5},
471
      {0xc8a883c0fdaf7df0, 0x6122cd128006b2ce},
472
      {0xfad2a4b13d1b5d6c, 0x796b805720085f82},
473
      {0x9cc3a6eec6311a63, 0xcbe3303674053bb1},
474
      {0xc3f490aa77bd60fc, 0xbedbfc4411068a9d},
475
      {0xf4f1b4d515acb93b, 0xee92fb5515482d45},
476
      {0x991711052d8bf3c5, 0x751bdd152d4d1c4b},
477
      {0xbf5cd54678eef0b6, 0xd262d45a78a0635e},
478
      {0xef340a98172aace4, 0x86fb897116c87c35},
479
      {0x9580869f0e7aac0e, 0xd45d35e6ae3d4da1},
480
      {0xbae0a846d2195712, 0x8974836059cca10a},
481
      {0xe998d258869facd7, 0x2bd1a438703fc94c},
482
      {0x91ff83775423cc06, 0x7b6306a34627ddd0},
483
      {0xb67f6455292cbf08, 0x1a3bc84c17b1d543},
484
      {0xe41f3d6a7377eeca, 0x20caba5f1d9e4a94},
485
      {0x8e938662882af53e, 0x547eb47b7282ee9d},
486
      {0xb23867fb2a35b28d, 0xe99e619a4f23aa44},
487
      {0xdec681f9f4c31f31, 0x6405fa00e2ec94d5},
488
      {0x8b3c113c38f9f37e, 0xde83bc408dd3dd05},
489
      {0xae0b158b4738705e, 0x9624ab50b148d446},
490
      {0xd98ddaee19068c76, 0x3badd624dd9b0958},
491
      {0x87f8a8d4cfa417c9, 0xe54ca5d70a80e5d7},
492
      {0xa9f6d30a038d1dbc, 0x5e9fcf4ccd211f4d},
493
      {0xd47487cc8470652b, 0x7647c32000696720},
494
      {0x84c8d4dfd2c63f3b, 0x29ecd9f40041e074},
495
      {0xa5fb0a17c777cf09, 0xf468107100525891},
496
      {0xcf79cc9db955c2cc, 0x7182148d4066eeb5},
497
      {0x81ac1fe293d599bf, 0xc6f14cd848405531},
498
      {0xa21727db38cb002f, 0xb8ada00e5a506a7d},
499
      {0xca9cf1d206fdc03b, 0xa6d90811f0e4851d},
500
      {0xfd442e4688bd304a, 0x908f4a166d1da664},
501
      {0x9e4a9cec15763e2e, 0x9a598e4e043287ff},
502
      {0xc5dd44271ad3cdba, 0x40eff1e1853f29fe},
503
      {0xf7549530e188c128, 0xd12bee59e68ef47d},
504
      {0x9a94dd3e8cf578b9, 0x82bb74f8301958cf},
505
      {0xc13a148e3032d6e7, 0xe36a52363c1faf02},
506
      {0xf18899b1bc3f8ca1, 0xdc44e6c3cb279ac2},
507
      {0x96f5600f15a7b7e5, 0x29ab103a5ef8c0ba},
508
      {0xbcb2b812db11a5de, 0x7415d448f6b6f0e8},
509
      {0xebdf661791d60f56, 0x111b495b3464ad22},
510
      {0x936b9fcebb25c995, 0xcab10dd900beec35},
511
      {0xb84687c269ef3bfb, 0x3d5d514f40eea743},
512
      {0xe65829b3046b0afa, 0x0cb4a5a3112a5113},
513
      {0x8ff71a0fe2c2e6dc, 0x47f0e785eaba72ac},
514
      {0xb3f4e093db73a093, 0x59ed216765690f57},
515
      {0xe0f218b8d25088b8, 0x306869c13ec3532d},
516
      {0x8c974f7383725573, 0x1e414218c73a13fc},
517
      {0xafbd2350644eeacf, 0xe5d1929ef90898fb},
518
      {0xdbac6c247d62a583, 0xdf45f746b74abf3a},
519
      {0x894bc396ce5da772, 0x6b8bba8c328eb784},
520
      {0xab9eb47c81f5114f, 0x066ea92f3f326565},
521
      {0xd686619ba27255a2, 0xc80a537b0efefebe},
522
      {0x8613fd0145877585, 0xbd06742ce95f5f37},
523
      {0xa798fc4196e952e7, 0x2c48113823b73705},
524
      {0xd17f3b51fca3a7a0, 0xf75a15862ca504c6},
525
      {0x82ef85133de648c4, 0x9a984d73dbe722fc},
526
      {0xa3ab66580d5fdaf5, 0xc13e60d0d2e0ebbb},
527
      {0xcc963fee10b7d1b3, 0x318df905079926a9},
528
      {0xffbbcfe994e5c61f, 0xfdf17746497f7053},
529
      {0x9fd561f1fd0f9bd3, 0xfeb6ea8bedefa634},
530
      {0xc7caba6e7c5382c8, 0xfe64a52ee96b8fc1},
531
      {0xf9bd690a1b68637b, 0x3dfdce7aa3c673b1},
532
      {0x9c1661a651213e2d, 0x06bea10ca65c084f},
533
      {0xc31bfa0fe5698db8, 0x486e494fcff30a63},
534
      {0xf3e2f893dec3f126, 0x5a89dba3c3efccfb},
535
      {0x986ddb5c6b3a76b7, 0xf89629465a75e01d},
536
      {0xbe89523386091465, 0xf6bbb397f1135824},
537
      {0xee2ba6c0678b597f, 0x746aa07ded582e2d},
538
      {0x94db483840b717ef, 0xa8c2a44eb4571cdd},
539
      {0xba121a4650e4ddeb, 0x92f34d62616ce414},
540
      {0xe896a0d7e51e1566, 0x77b020baf9c81d18},
541
      {0x915e2486ef32cd60, 0x0ace1474dc1d122f},
542
      {0xb5b5ada8aaff80b8, 0x0d819992132456bb},
543
      {0xe3231912d5bf60e6, 0x10e1fff697ed6c6a},
544
      {0x8df5efabc5979c8f, 0xca8d3ffa1ef463c2},
545
      {0xb1736b96b6fd83b3, 0xbd308ff8a6b17cb3},
546
      {0xddd0467c64bce4a0, 0xac7cb3f6d05ddbdf},
547
      {0x8aa22c0dbef60ee4, 0x6bcdf07a423aa96c},
548
      {0xad4ab7112eb3929d, 0x86c16c98d2c953c7},
549
      {0xd89d64d57a607744, 0xe871c7bf077ba8b8},
550
      {0x87625f056c7c4a8b, 0x11471cd764ad4973},
551
      {0xa93af6c6c79b5d2d, 0xd598e40d3dd89bd0},
552
      {0xd389b47879823479, 0x4aff1d108d4ec2c4},
553
      {0x843610cb4bf160cb, 0xcedf722a585139bb},
554
      {0xa54394fe1eedb8fe, 0xc2974eb4ee658829},
555
      {0xce947a3da6a9273e, 0x733d226229feea33},
556
      {0x811ccc668829b887, 0x0806357d5a3f5260},
557
      {0xa163ff802a3426a8, 0xca07c2dcb0cf26f8},
558
      {0xc9bcff6034c13052, 0xfc89b393dd02f0b6},
559
      {0xfc2c3f3841f17c67, 0xbbac2078d443ace3},
560
      {0x9d9ba7832936edc0, 0xd54b944b84aa4c0e},
561
      {0xc5029163f384a931, 0x0a9e795e65d4df12},
562
      {0xf64335bcf065d37d, 0x4d4617b5ff4a16d6},
563
      {0x99ea0196163fa42e, 0x504bced1bf8e4e46},
564
      {0xc06481fb9bcf8d39, 0xe45ec2862f71e1d7},
565
      {0xf07da27a82c37088, 0x5d767327bb4e5a4d},
566
      {0x964e858c91ba2655, 0x3a6a07f8d510f870},
567
      {0xbbe226efb628afea, 0x890489f70a55368c},
568
      {0xeadab0aba3b2dbe5, 0x2b45ac74ccea842f},
569
      {0x92c8ae6b464fc96f, 0x3b0b8bc90012929e},
570
      {0xb77ada0617e3bbcb, 0x09ce6ebb40173745},
571
      {0xe55990879ddcaabd, 0xcc420a6a101d0516},
572
      {0x8f57fa54c2a9eab6, 0x9fa946824a12232e},
573
      {0xb32df8e9f3546564, 0x47939822dc96abfa},
574
      {0xdff9772470297ebd, 0x59787e2b93bc56f8},
575
      {0x8bfbea76c619ef36, 0x57eb4edb3c55b65b},
576
      {0xaefae51477a06b03, 0xede622920b6b23f2},
577
      {0xdab99e59958885c4, 0xe95fab368e45ecee},
578
      {0x88b402f7fd75539b, 0x11dbcb0218ebb415},
579
      {0xaae103b5fcd2a881, 0xd652bdc29f26a11a},
580
      {0xd59944a37c0752a2, 0x4be76d3346f04960},
581
      {0x857fcae62d8493a5, 0x6f70a4400c562ddc},
582
      {0xa6dfbd9fb8e5b88e, 0xcb4ccd500f6bb953},
583
      {0xd097ad07a71f26b2, 0x7e2000a41346a7a8},
584
      {0x825ecc24c873782f, 0x8ed400668c0c28c9},
585
      {0xa2f67f2dfa90563b, 0x728900802f0f32fb},
586
      {0xcbb41ef979346bca, 0x4f2b40a03ad2ffba},
587
      {0xfea126b7d78186bc, 0xe2f610c84987bfa9},
588
      {0x9f24b832e6b0f436, 0x0dd9ca7d2df4d7ca},
589
      {0xc6ede63fa05d3143, 0x91503d1c79720dbc},
590
      {0xf8a95fcf88747d94, 0x75a44c6397ce912b},
591
      {0x9b69dbe1b548ce7c, 0xc986afbe3ee11abb},
592
      {0xc24452da229b021b, 0xfbe85badce996169},
593
      {0xf2d56790ab41c2a2, 0xfae27299423fb9c4},
594
      {0x97c560ba6b0919a5, 0xdccd879fc967d41b},
595
      {0xbdb6b8e905cb600f, 0x5400e987bbc1c921},
596
      {0xed246723473e3813, 0x290123e9aab23b69},
597
      {0x9436c0760c86e30b, 0xf9a0b6720aaf6522},
598
      {0xb94470938fa89bce, 0xf808e40e8d5b3e6a},
599
      {0xe7958cb87392c2c2, 0xb60b1d1230b20e05},
600
      {0x90bd77f3483bb9b9, 0xb1c6f22b5e6f48c3},
601
      {0xb4ecd5f01a4aa828, 0x1e38aeb6360b1af4},
602
      {0xe2280b6c20dd5232, 0x25c6da63c38de1b1},
603
      {0x8d590723948a535f, 0x579c487e5a38ad0f},
604
      {0xb0af48ec79ace837, 0x2d835a9df0c6d852},
605
      {0xdcdb1b2798182244, 0xf8e431456cf88e66},
606
      {0x8a08f0f8bf0f156b, 0x1b8e9ecb641b5900},
607
      {0xac8b2d36eed2dac5, 0xe272467e3d222f40},
608
      {0xd7adf884aa879177, 0x5b0ed81dcc6abb10},
609
      {0x86ccbb52ea94baea, 0x98e947129fc2b4ea},
610
      {0xa87fea27a539e9a5, 0x3f2398d747b36225},
611
      {0xd29fe4b18e88640e, 0x8eec7f0d19a03aae},
612
      {0x83a3eeeef9153e89, 0x1953cf68300424ad},
613
      {0xa48ceaaab75a8e2b, 0x5fa8c3423c052dd8},
614
      {0xcdb02555653131b6, 0x3792f412cb06794e},
615
      {0x808e17555f3ebf11, 0xe2bbd88bbee40bd1},
616
      {0xa0b19d2ab70e6ed6, 0x5b6aceaeae9d0ec5},
617
      {0xc8de047564d20a8b, 0xf245825a5a445276},
618
      {0xfb158592be068d2e, 0xeed6e2f0f0d56713},
619
      {0x9ced737bb6c4183d, 0x55464dd69685606c},
620
      {0xc428d05aa4751e4c, 0xaa97e14c3c26b887},
621
      {0xf53304714d9265df, 0xd53dd99f4b3066a9},
622
      {0x993fe2c6d07b7fab, 0xe546a8038efe402a},
623
      {0xbf8fdb78849a5f96, 0xde98520472bdd034},
624
      {0xef73d256a5c0f77c, 0x963e66858f6d4441},
625
      {0x95a8637627989aad, 0xdde7001379a44aa9},
626
      {0xbb127c53b17ec159, 0x5560c018580d5d53},
627
      {0xe9d71b689dde71af, 0xaab8f01e6e10b4a7},
628
      {0x9226712162ab070d, 0xcab3961304ca70e9},
629
      {0xb6b00d69bb55c8d1, 0x3d607b97c5fd0d23},
630
      {0xe45c10c42a2b3b05, 0x8cb89a7db77c506b},
631
      {0x8eb98a7a9a5b04e3, 0x77f3608e92adb243},
632
      {0xb267ed1940f1c61c, 0x55f038b237591ed4},
633
      {0xdf01e85f912e37a3, 0x6b6c46dec52f6689},
634
      {0x8b61313bbabce2c6, 0x2323ac4b3b3da016},
635
      {0xae397d8aa96c1b77, 0xabec975e0a0d081b},
636
      {0xd9c7dced53c72255, 0x96e7bd358c904a22},
637
      {0x881cea14545c7575, 0x7e50d64177da2e55},
638
      {0xaa242499697392d2, 0xdde50bd1d5d0b9ea},
639
      {0xd4ad2dbfc3d07787, 0x955e4ec64b44e865},
640
      {0x84ec3c97da624ab4, 0xbd5af13bef0b113f},
641
      {0xa6274bbdd0fadd61, 0xecb1ad8aeacdd58f},
642
      {0xcfb11ead453994ba, 0x67de18eda5814af3},
643
      {0x81ceb32c4b43fcf4, 0x80eacf948770ced8},
644
      {0xa2425ff75e14fc31, 0xa1258379a94d028e},
645
      {0xcad2f7f5359a3b3e, 0x096ee45813a04331},
646
      {0xfd87b5f28300ca0d, 0x8bca9d6e188853fd},
647
      {0x9e74d1b791e07e48, 0x775ea264cf55347e},
648
      {0xc612062576589dda, 0x95364afe032a819e},
649
      {0xf79687aed3eec551, 0x3a83ddbd83f52205},
650
      {0x9abe14cd44753b52, 0xc4926a9672793543},
651
      {0xc16d9a0095928a27, 0x75b7053c0f178294},
652
      {0xf1c90080baf72cb1, 0x5324c68b12dd6339},
653
      {0x971da05074da7bee, 0xd3f6fc16ebca5e04},
654
      {0xbce5086492111aea, 0x88f4bb1ca6bcf585},
655
      {0xec1e4a7db69561a5, 0x2b31e9e3d06c32e6},
656
      {0x9392ee8e921d5d07, 0x3aff322e62439fd0},
657
      {0xb877aa3236a4b449, 0x09befeb9fad487c3},
658
      {0xe69594bec44de15b, 0x4c2ebe687989a9b4},
659
      {0x901d7cf73ab0acd9, 0x0f9d37014bf60a11},
660
      {0xb424dc35095cd80f, 0x538484c19ef38c95},
661
      {0xe12e13424bb40e13, 0x2865a5f206b06fba},
662
      {0x8cbccc096f5088cb, 0xf93f87b7442e45d4},
663
      {0xafebff0bcb24aafe, 0xf78f69a51539d749},
664
      {0xdbe6fecebdedd5be, 0xb573440e5a884d1c},
665
      {0x89705f4136b4a597, 0x31680a88f8953031},
666
      {0xabcc77118461cefc, 0xfdc20d2b36ba7c3e},
667
      {0xd6bf94d5e57a42bc, 0x3d32907604691b4d},
668
      {0x8637bd05af6c69b5, 0xa63f9a49c2c1b110},
669
      {0xa7c5ac471b478423, 0x0fcf80dc33721d54},
670
      {0xd1b71758e219652b, 0xd3c36113404ea4a9},
671
      {0x83126e978d4fdf3b, 0x645a1cac083126ea},
672
      {0xa3d70a3d70a3d70a, 0x3d70a3d70a3d70a4},
673
      {0xcccccccccccccccc, 0xcccccccccccccccd},
674
      {0x8000000000000000, 0x0000000000000000},
675
      {0xa000000000000000, 0x0000000000000000},
676
      {0xc800000000000000, 0x0000000000000000},
677
      {0xfa00000000000000, 0x0000000000000000},
678
      {0x9c40000000000000, 0x0000000000000000},
679
      {0xc350000000000000, 0x0000000000000000},
680
      {0xf424000000000000, 0x0000000000000000},
681
      {0x9896800000000000, 0x0000000000000000},
682
      {0xbebc200000000000, 0x0000000000000000},
683
      {0xee6b280000000000, 0x0000000000000000},
684
      {0x9502f90000000000, 0x0000000000000000},
685
      {0xba43b74000000000, 0x0000000000000000},
686
      {0xe8d4a51000000000, 0x0000000000000000},
687
      {0x9184e72a00000000, 0x0000000000000000},
688
      {0xb5e620f480000000, 0x0000000000000000},
689
      {0xe35fa931a0000000, 0x0000000000000000},
690
      {0x8e1bc9bf04000000, 0x0000000000000000},
691
      {0xb1a2bc2ec5000000, 0x0000000000000000},
692
      {0xde0b6b3a76400000, 0x0000000000000000},
693
      {0x8ac7230489e80000, 0x0000000000000000},
694
      {0xad78ebc5ac620000, 0x0000000000000000},
695
      {0xd8d726b7177a8000, 0x0000000000000000},
696
      {0x878678326eac9000, 0x0000000000000000},
697
      {0xa968163f0a57b400, 0x0000000000000000},
698
      {0xd3c21bcecceda100, 0x0000000000000000},
699
      {0x84595161401484a0, 0x0000000000000000},
700
      {0xa56fa5b99019a5c8, 0x0000000000000000},
701
      {0xcecb8f27f4200f3a, 0x0000000000000000},
702
      {0x813f3978f8940984, 0x4000000000000000},
703
      {0xa18f07d736b90be5, 0x5000000000000000},
704
      {0xc9f2c9cd04674ede, 0xa400000000000000},
705
      {0xfc6f7c4045812296, 0x4d00000000000000},
706
      {0x9dc5ada82b70b59d, 0xf020000000000000},
707
      {0xc5371912364ce305, 0x6c28000000000000},
708
      {0xf684df56c3e01bc6, 0xc732000000000000},
709
      {0x9a130b963a6c115c, 0x3c7f400000000000},
710
      {0xc097ce7bc90715b3, 0x4b9f100000000000},
711
      {0xf0bdc21abb48db20, 0x1e86d40000000000},
712
      {0x96769950b50d88f4, 0x1314448000000000},
713
      {0xbc143fa4e250eb31, 0x17d955a000000000},
714
      {0xeb194f8e1ae525fd, 0x5dcfab0800000000},
715
      {0x92efd1b8d0cf37be, 0x5aa1cae500000000},
716
      {0xb7abc627050305ad, 0xf14a3d9e40000000},
717
      {0xe596b7b0c643c719, 0x6d9ccd05d0000000},
718
      {0x8f7e32ce7bea5c6f, 0xe4820023a2000000},
719
      {0xb35dbf821ae4f38b, 0xdda2802c8a800000},
720
      {0xe0352f62a19e306e, 0xd50b2037ad200000},
721
      {0x8c213d9da502de45, 0x4526f422cc340000},
722
      {0xaf298d050e4395d6, 0x9670b12b7f410000},
723
      {0xdaf3f04651d47b4c, 0x3c0cdd765f114000},
724
      {0x88d8762bf324cd0f, 0xa5880a69fb6ac800},
725
      {0xab0e93b6efee0053, 0x8eea0d047a457a00},
726
      {0xd5d238a4abe98068, 0x72a4904598d6d880},
727
      {0x85a36366eb71f041, 0x47a6da2b7f864750},
728
      {0xa70c3c40a64e6c51, 0x999090b65f67d924},
729
      {0xd0cf4b50cfe20765, 0xfff4b4e3f741cf6d},
730
      {0x82818f1281ed449f, 0xbff8f10e7a8921a5},
731
      {0xa321f2d7226895c7, 0xaff72d52192b6a0e},
732
      {0xcbea6f8ceb02bb39, 0x9bf4f8a69f764491},
733
      {0xfee50b7025c36a08, 0x02f236d04753d5b5},
734
      {0x9f4f2726179a2245, 0x01d762422c946591},
735
      {0xc722f0ef9d80aad6, 0x424d3ad2b7b97ef6},
736
      {0xf8ebad2b84e0d58b, 0xd2e0898765a7deb3},
737
      {0x9b934c3b330c8577, 0x63cc55f49f88eb30},
738
      {0xc2781f49ffcfa6d5, 0x3cbf6b71c76b25fc},
739
      {0xf316271c7fc3908a, 0x8bef464e3945ef7b},
740
      {0x97edd871cfda3a56, 0x97758bf0e3cbb5ad},
741
      {0xbde94e8e43d0c8ec, 0x3d52eeed1cbea318},
742
      {0xed63a231d4c4fb27, 0x4ca7aaa863ee4bde},
743
      {0x945e455f24fb1cf8, 0x8fe8caa93e74ef6b},
744
      {0xb975d6b6ee39e436, 0xb3e2fd538e122b45},
745
      {0xe7d34c64a9c85d44, 0x60dbbca87196b617},
746
      {0x90e40fbeea1d3a4a, 0xbc8955e946fe31ce},
747
      {0xb51d13aea4a488dd, 0x6babab6398bdbe42},
748
      {0xe264589a4dcdab14, 0xc696963c7eed2dd2},
749
      {0x8d7eb76070a08aec, 0xfc1e1de5cf543ca3},
750
      {0xb0de65388cc8ada8, 0x3b25a55f43294bcc},
751
      {0xdd15fe86affad912, 0x49ef0eb713f39ebf},
752
      {0x8a2dbf142dfcc7ab, 0x6e3569326c784338},
753
      {0xacb92ed9397bf996, 0x49c2c37f07965405},
754
      {0xd7e77a8f87daf7fb, 0xdc33745ec97be907},
755
      {0x86f0ac99b4e8dafd, 0x69a028bb3ded71a4},
756
      {0xa8acd7c0222311bc, 0xc40832ea0d68ce0d},
757
      {0xd2d80db02aabd62b, 0xf50a3fa490c30191},
758
      {0x83c7088e1aab65db, 0x792667c6da79e0fb},
759
      {0xa4b8cab1a1563f52, 0x577001b891185939},
760
      {0xcde6fd5e09abcf26, 0xed4c0226b55e6f87},
761
      {0x80b05e5ac60b6178, 0x544f8158315b05b5},
762
      {0xa0dc75f1778e39d6, 0x696361ae3db1c722},
763
      {0xc913936dd571c84c, 0x03bc3a19cd1e38ea},
764
      {0xfb5878494ace3a5f, 0x04ab48a04065c724},
765
      {0x9d174b2dcec0e47b, 0x62eb0d64283f9c77},
766
      {0xc45d1df942711d9a, 0x3ba5d0bd324f8395},
767
      {0xf5746577930d6500, 0xca8f44ec7ee3647a},
768
      {0x9968bf6abbe85f20, 0x7e998b13cf4e1ecc},
769
      {0xbfc2ef456ae276e8, 0x9e3fedd8c321a67f},
770
      {0xefb3ab16c59b14a2, 0xc5cfe94ef3ea101f},
771
      {0x95d04aee3b80ece5, 0xbba1f1d158724a13},
772
      {0xbb445da9ca61281f, 0x2a8a6e45ae8edc98},
773
      {0xea1575143cf97226, 0xf52d09d71a3293be},
774
      {0x924d692ca61be758, 0x593c2626705f9c57},
775
      {0xb6e0c377cfa2e12e, 0x6f8b2fb00c77836d},
776
      {0xe498f455c38b997a, 0x0b6dfb9c0f956448},
777
      {0x8edf98b59a373fec, 0x4724bd4189bd5ead},
778
      {0xb2977ee300c50fe7, 0x58edec91ec2cb658},
779
      {0xdf3d5e9bc0f653e1, 0x2f2967b66737e3ee},
780
      {0x8b865b215899f46c, 0xbd79e0d20082ee75},
781
      {0xae67f1e9aec07187, 0xecd8590680a3aa12},
782
      {0xda01ee641a708de9, 0xe80e6f4820cc9496},
783
      {0x884134fe908658b2, 0x3109058d147fdcde},
784
      {0xaa51823e34a7eede, 0xbd4b46f0599fd416},
785
      {0xd4e5e2cdc1d1ea96, 0x6c9e18ac7007c91b},
786
      {0x850fadc09923329e, 0x03e2cf6bc604ddb1},
787
      {0xa6539930bf6bff45, 0x84db8346b786151d},
788
      {0xcfe87f7cef46ff16, 0xe612641865679a64},
789
      {0x81f14fae158c5f6e, 0x4fcb7e8f3f60c07f},
790
      {0xa26da3999aef7749, 0xe3be5e330f38f09e},
791
      {0xcb090c8001ab551c, 0x5cadf5bfd3072cc6},
792
      {0xfdcb4fa002162a63, 0x73d9732fc7c8f7f7},
793
      {0x9e9f11c4014dda7e, 0x2867e7fddcdd9afb},
794
      {0xc646d63501a1511d, 0xb281e1fd541501b9},
795
      {0xf7d88bc24209a565, 0x1f225a7ca91a4227},
796
      {0x9ae757596946075f, 0x3375788de9b06959},
797
      {0xc1a12d2fc3978937, 0x0052d6b1641c83af},
798
      {0xf209787bb47d6b84, 0xc0678c5dbd23a49b},
799
      {0x9745eb4d50ce6332, 0xf840b7ba963646e1},
800
      {0xbd176620a501fbff, 0xb650e5a93bc3d899},
801
      {0xec5d3fa8ce427aff, 0xa3e51f138ab4cebf},
802
      {0x93ba47c980e98cdf, 0xc66f336c36b10138},
803
      {0xb8a8d9bbe123f017, 0xb80b0047445d4185},
804
      {0xe6d3102ad96cec1d, 0xa60dc059157491e6},
805
      {0x9043ea1ac7e41392, 0x87c89837ad68db30},
806
      {0xb454e4a179dd1877, 0x29babe4598c311fc},
807
      {0xe16a1dc9d8545e94, 0xf4296dd6fef3d67b},
808
      {0x8ce2529e2734bb1d, 0x1899e4a65f58660d},
809
      {0xb01ae745b101e9e4, 0x5ec05dcff72e7f90},
810
      {0xdc21a1171d42645d, 0x76707543f4fa1f74},
811
      {0x899504ae72497eba, 0x6a06494a791c53a9},
812
      {0xabfa45da0edbde69, 0x0487db9d17636893},
813
      {0xd6f8d7509292d603, 0x45a9d2845d3c42b7},
814
      {0x865b86925b9bc5c2, 0x0b8a2392ba45a9b3},
815
      {0xa7f26836f282b732, 0x8e6cac7768d7141f},
816
      {0xd1ef0244af2364ff, 0x3207d795430cd927},
817
      {0x8335616aed761f1f, 0x7f44e6bd49e807b9},
818
      {0xa402b9c5a8d3a6e7, 0x5f16206c9c6209a7},
819
      {0xcd036837130890a1, 0x36dba887c37a8c10},
820
      {0x802221226be55a64, 0xc2494954da2c978a},
821
      {0xa02aa96b06deb0fd, 0xf2db9baa10b7bd6d},
822
      {0xc83553c5c8965d3d, 0x6f92829494e5acc8},
823
      {0xfa42a8b73abbf48c, 0xcb772339ba1f17fa},
824
      {0x9c69a97284b578d7, 0xff2a760414536efc},
825
      {0xc38413cf25e2d70d, 0xfef5138519684abb},
826
      {0xf46518c2ef5b8cd1, 0x7eb258665fc25d6a},
827
      {0x98bf2f79d5993802, 0xef2f773ffbd97a62},
828
      {0xbeeefb584aff8603, 0xaafb550ffacfd8fb},
829
      {0xeeaaba2e5dbf6784, 0x95ba2a53f983cf39},
830
      {0x952ab45cfa97a0b2, 0xdd945a747bf26184},
831
      {0xba756174393d88df, 0x94f971119aeef9e5},
832
      {0xe912b9d1478ceb17, 0x7a37cd5601aab85e},
833
      {0x91abb422ccb812ee, 0xac62e055c10ab33b},
834
      {0xb616a12b7fe617aa, 0x577b986b314d600a},
835
      {0xe39c49765fdf9d94, 0xed5a7e85fda0b80c},
836
      {0x8e41ade9fbebc27d, 0x14588f13be847308},
837
      {0xb1d219647ae6b31c, 0x596eb2d8ae258fc9},
838
      {0xde469fbd99a05fe3, 0x6fca5f8ed9aef3bc},
839
      {0x8aec23d680043bee, 0x25de7bb9480d5855},
840
      {0xada72ccc20054ae9, 0xaf561aa79a10ae6b},
841
      {0xd910f7ff28069da4, 0x1b2ba1518094da05},
842
      {0x87aa9aff79042286, 0x90fb44d2f05d0843},
843
      {0xa99541bf57452b28, 0x353a1607ac744a54},
844
      {0xd3fa922f2d1675f2, 0x42889b8997915ce9},
845
      {0x847c9b5d7c2e09b7, 0x69956135febada12},
846
      {0xa59bc234db398c25, 0x43fab9837e699096},
847
      {0xcf02b2c21207ef2e, 0x94f967e45e03f4bc},
848
      {0x8161afb94b44f57d, 0x1d1be0eebac278f6},
849
      {0xa1ba1ba79e1632dc, 0x6462d92a69731733},
850
      {0xca28a291859bbf93, 0x7d7b8f7503cfdcff},
851
      {0xfcb2cb35e702af78, 0x5cda735244c3d43f},
852
      {0x9defbf01b061adab, 0x3a0888136afa64a8},
853
      {0xc56baec21c7a1916, 0x088aaa1845b8fdd1},
854
      {0xf6c69a72a3989f5b, 0x8aad549e57273d46},
855
      {0x9a3c2087a63f6399, 0x36ac54e2f678864c},
856
      {0xc0cb28a98fcf3c7f, 0x84576a1bb416a7de},
857
      {0xf0fdf2d3f3c30b9f, 0x656d44a2a11c51d6},
858
      {0x969eb7c47859e743, 0x9f644ae5a4b1b326},
859
      {0xbc4665b596706114, 0x873d5d9f0dde1fef},
860
      {0xeb57ff22fc0c7959, 0xa90cb506d155a7eb},
861
      {0x9316ff75dd87cbd8, 0x09a7f12442d588f3},
862
      {0xb7dcbf5354e9bece, 0x0c11ed6d538aeb30},
863
      {0xe5d3ef282a242e81, 0x8f1668c8a86da5fb},
864
      {0x8fa475791a569d10, 0xf96e017d694487bd},
865
      {0xb38d92d760ec4455, 0x37c981dcc395a9ad},
866
      {0xe070f78d3927556a, 0x85bbe253f47b1418},
867
      {0x8c469ab843b89562, 0x93956d7478ccec8f},
868
      {0xaf58416654a6babb, 0x387ac8d1970027b3},
869
      {0xdb2e51bfe9d0696a, 0x06997b05fcc0319f},
870
      {0x88fcf317f22241e2, 0x441fece3bdf81f04},
871
      {0xab3c2fddeeaad25a, 0xd527e81cad7626c4},
872
      {0xd60b3bd56a5586f1, 0x8a71e223d8d3b075},
873
      {0x85c7056562757456, 0xf6872d5667844e4a},
874
      {0xa738c6bebb12d16c, 0xb428f8ac016561dc},
875
      {0xd106f86e69d785c7, 0xe13336d701beba53},
876
      {0x82a45b450226b39c, 0xecc0024661173474},
877
      {0xa34d721642b06084, 0x27f002d7f95d0191},
878
      {0xcc20ce9bd35c78a5, 0x31ec038df7b441f5},
879
      {0xff290242c83396ce, 0x7e67047175a15272},
880
      {0x9f79a169bd203e41, 0x0f0062c6e984d387},
881
      {0xc75809c42c684dd1, 0x52c07b78a3e60869},
882
      {0xf92e0c3537826145, 0xa7709a56ccdf8a83},
883
      {0x9bbcc7a142b17ccb, 0x88a66076400bb692},
884
      {0xc2abf989935ddbfe, 0x6acff893d00ea436},
885
      {0xf356f7ebf83552fe, 0x0583f6b8c4124d44},
886
      {0x98165af37b2153de, 0xc3727a337a8b704b},
887
      {0xbe1bf1b059e9a8d6, 0x744f18c0592e4c5d},
888
      {0xeda2ee1c7064130c, 0x1162def06f79df74},
889
      {0x9485d4d1c63e8be7, 0x8addcb5645ac2ba9},
890
      {0xb9a74a0637ce2ee1, 0x6d953e2bd7173693},
891
      {0xe8111c87c5c1ba99, 0xc8fa8db6ccdd0438},
892
      {0x910ab1d4db9914a0, 0x1d9c9892400a22a3},
893
      {0xb54d5e4a127f59c8, 0x2503beb6d00cab4c},
894
      {0xe2a0b5dc971f303a, 0x2e44ae64840fd61e},
895
      {0x8da471a9de737e24, 0x5ceaecfed289e5d3},
896
      {0xb10d8e1456105dad, 0x7425a83e872c5f48},
897
      {0xdd50f1996b947518, 0xd12f124e28f7771a},
898
      {0x8a5296ffe33cc92f, 0x82bd6b70d99aaa70},
899
      {0xace73cbfdc0bfb7b, 0x636cc64d1001550c},
900
      {0xd8210befd30efa5a, 0x3c47f7e05401aa4f},
901
      {0x8714a775e3e95c78, 0x65acfaec34810a72},
902
      {0xa8d9d1535ce3b396, 0x7f1839a741a14d0e},
903
      {0xd31045a8341ca07c, 0x1ede48111209a051},
904
      {0x83ea2b892091e44d, 0x934aed0aab460433},
905
      {0xa4e4b66b68b65d60, 0xf81da84d56178540},
906
      {0xce1de40642e3f4b9, 0x36251260ab9d668f},
907
      {0x80d2ae83e9ce78f3, 0xc1d72b7c6b42601a},
908
      {0xa1075a24e4421730, 0xb24cf65b8612f820},
909
      {0xc94930ae1d529cfc, 0xdee033f26797b628},
910
      {0xfb9b7cd9a4a7443c, 0x169840ef017da3b2},
911
      {0x9d412e0806e88aa5, 0x8e1f289560ee864f},
912
      {0xc491798a08a2ad4e, 0xf1a6f2bab92a27e3},
913
      {0xf5b5d7ec8acb58a2, 0xae10af696774b1dc},
914
      {0x9991a6f3d6bf1765, 0xacca6da1e0a8ef2a},
915
      {0xbff610b0cc6edd3f, 0x17fd090a58d32af4},
916
      {0xeff394dcff8a948e, 0xddfc4b4cef07f5b1},
917
      {0x95f83d0a1fb69cd9, 0x4abdaf101564f98f},
918
      {0xbb764c4ca7a4440f, 0x9d6d1ad41abe37f2},
919
      {0xea53df5fd18d5513, 0x84c86189216dc5ee},
920
      {0x92746b9be2f8552c, 0x32fd3cf5b4e49bb5},
921
      {0xb7118682dbb66a77, 0x3fbc8c33221dc2a2},
922
      {0xe4d5e82392a40515, 0x0fabaf3feaa5334b},
923
      {0x8f05b1163ba6832d, 0x29cb4d87f2a7400f},
924
      {0xb2c71d5bca9023f8, 0x743e20e9ef511013},
925
      {0xdf78e4b2bd342cf6, 0x914da9246b255417},
926
      {0x8bab8eefb6409c1a, 0x1ad089b6c2f7548f},
927
      {0xae9672aba3d0c320, 0xa184ac2473b529b2},
928
      {0xda3c0f568cc4f3e8, 0xc9e5d72d90a2741f},
929
      {0x8865899617fb1871, 0x7e2fa67c7a658893},
930
      {0xaa7eebfb9df9de8d, 0xddbb901b98feeab8},
931
      {0xd51ea6fa85785631, 0x552a74227f3ea566},
932
      {0x8533285c936b35de, 0xd53a88958f872760},
933
      {0xa67ff273b8460356, 0x8a892abaf368f138},
934
      {0xd01fef10a657842c, 0x2d2b7569b0432d86},
935
      {0x8213f56a67f6b29b, 0x9c3b29620e29fc74},
936
      {0xa298f2c501f45f42, 0x8349f3ba91b47b90},
937
      {0xcb3f2f7642717713, 0x241c70a936219a74},
938
      {0xfe0efb53d30dd4d7, 0xed238cd383aa0111},
939
      {0x9ec95d1463e8a506, 0xf4363804324a40ab},
940
      {0xc67bb4597ce2ce48, 0xb143c6053edcd0d6},
941
      {0xf81aa16fdc1b81da, 0xdd94b7868e94050b},
942
      {0x9b10a4e5e9913128, 0xca7cf2b4191c8327},
943
      {0xc1d4ce1f63f57d72, 0xfd1c2f611f63a3f1},
944
      {0xf24a01a73cf2dccf, 0xbc633b39673c8ced},
945
      {0x976e41088617ca01, 0xd5be0503e085d814},
946
      {0xbd49d14aa79dbc82, 0x4b2d8644d8a74e19},
947
      {0xec9c459d51852ba2, 0xddf8e7d60ed1219f},
948
      {0x93e1ab8252f33b45, 0xcabb90e5c942b504},
949
      {0xb8da1662e7b00a17, 0x3d6a751f3b936244},
950
      {0xe7109bfba19c0c9d, 0x0cc512670a783ad5},
951
      {0x906a617d450187e2, 0x27fb2b80668b24c6},
952
      {0xb484f9dc9641e9da, 0xb1f9f660802dedf7},
953
      {0xe1a63853bbd26451, 0x5e7873f8a0396974},
954
      {0x8d07e33455637eb2, 0xdb0b487b6423e1e9},
955
      {0xb049dc016abc5e5f, 0x91ce1a9a3d2cda63},
956
      {0xdc5c5301c56b75f7, 0x7641a140cc7810fc},
957
      {0x89b9b3e11b6329ba, 0xa9e904c87fcb0a9e},
958
      {0xac2820d9623bf429, 0x546345fa9fbdcd45},
959
      {0xd732290fbacaf133, 0xa97c177947ad4096},
960
      {0x867f59a9d4bed6c0, 0x49ed8eabcccc485e},
961
      {0xa81f301449ee8c70, 0x5c68f256bfff5a75},
962
      {0xd226fc195c6a2f8c, 0x73832eec6fff3112},
963
      {0x83585d8fd9c25db7, 0xc831fd53c5ff7eac},
964
      {0xa42e74f3d032f525, 0xba3e7ca8b77f5e56},
965
      {0xcd3a1230c43fb26f, 0x28ce1bd2e55f35ec},
966
      {0x80444b5e7aa7cf85, 0x7980d163cf5b81b4},
967
      {0xa0555e361951c366, 0xd7e105bcc3326220},
968
      {0xc86ab5c39fa63440, 0x8dd9472bf3fefaa8},
969
      {0xfa856334878fc150, 0xb14f98f6f0feb952},
970
      {0x9c935e00d4b9d8d2, 0x6ed1bf9a569f33d4},
971
      {0xc3b8358109e84f07, 0x0a862f80ec4700c9},
972
      {0xf4a642e14c6262c8, 0xcd27bb612758c0fb},
973
      {0x98e7e9cccfbd7dbd, 0x8038d51cb897789d},
974
      {0xbf21e44003acdd2c, 0xe0470a63e6bd56c4},
975
      {0xeeea5d5004981478, 0x1858ccfce06cac75},
976
      {0x95527a5202df0ccb, 0x0f37801e0c43ebc9},
977
      {0xbaa718e68396cffd, 0xd30560258f54e6bb},
978
      {0xe950df20247c83fd, 0x47c6b82ef32a206a},
979
      {0x91d28b7416cdd27e, 0x4cdc331d57fa5442},
980
      {0xb6472e511c81471d, 0xe0133fe4adf8e953},
981
      {0xe3d8f9e563a198e5, 0x58180fddd97723a7},
982
      {0x8e679c2f5e44ff8f, 0x570f09eaa7ea7649},
983
      {0xb201833b35d63f73, 0x2cd2cc6551e513db},
984
      {0xde81e40a034bcf4f, 0xf8077f7ea65e58d2},
985
      {0x8b112e86420f6191, 0xfb04afaf27faf783},
986
      {0xadd57a27d29339f6, 0x79c5db9af1f9b564},
987
      {0xd94ad8b1c7380874, 0x18375281ae7822bd},
988
      {0x87cec76f1c830548, 0x8f2293910d0b15b6},
989
      {0xa9c2794ae3a3c69a, 0xb2eb3875504ddb23},
990
      {0xd433179d9c8cb841, 0x5fa60692a46151ec},
991
      {0x849feec281d7f328, 0xdbc7c41ba6bcd334},
992
      {0xa5c7ea73224deff3, 0x12b9b522906c0801},
993
      {0xcf39e50feae16bef, 0xd768226b34870a01},
994
      {0x81842f29f2cce375, 0xe6a1158300d46641},
995
      {0xa1e53af46f801c53, 0x60495ae3c1097fd1},
996
      {0xca5e89b18b602368, 0x385bb19cb14bdfc5},
997
      {0xfcf62c1dee382c42, 0x46729e03dd9ed7b6},
998
      {0x9e19db92b4e31ba9, 0x6c07a2c26a8346d2},
999
      {0xc5a05277621be293, 0xc7098b7305241886},
1000
      {0xf70867153aa2db38, 0xb8cbee4fc66d1ea8},
1001
      {0x9a65406d44a5c903, 0x737f74f1dc043329},
1002
      {0xc0fe908895cf3b44, 0x505f522e53053ff3},
1003
      {0xf13e34aabb430a15, 0x647726b9e7c68ff0},
1004
      {0x96c6e0eab509e64d, 0x5eca783430dc19f6},
1005
      {0xbc789925624c5fe0, 0xb67d16413d132073},
1006
      {0xeb96bf6ebadf77d8, 0xe41c5bd18c57e890},
1007
      {0x933e37a534cbaae7, 0x8e91b962f7b6f15a},
1008
      {0xb80dc58e81fe95a1, 0x723627bbb5a4adb1},
1009
      {0xe61136f2227e3b09, 0xcec3b1aaa30dd91d},
1010
      {0x8fcac257558ee4e6, 0x213a4f0aa5e8a7b2},
1011
      {0xb3bd72ed2af29e1f, 0xa988e2cd4f62d19e},
1012
      {0xe0accfa875af45a7, 0x93eb1b80a33b8606},
1013
      {0x8c6c01c9498d8b88, 0xbc72f130660533c4},
1014
      {0xaf87023b9bf0ee6a, 0xeb8fad7c7f8680b5},
1015
      {0xdb68c2ca82ed2a05, 0xa67398db9f6820e2},
1016
#else
1017
0
      {0xff77b1fcbebcdc4f, 0x25e8e89c13bb0f7b},
1018
0
      {0xce5d73ff402d98e3, 0xfb0a3d212dc81290},
1019
0
      {0xa6b34ad8c9dfc06f, 0xf42faa48c0ea481f},
1020
0
      {0x86a8d39ef77164bc, 0xae5dff9c02033198},
1021
0
      {0xd98ddaee19068c76, 0x3badd624dd9b0958},
1022
0
      {0xafbd2350644eeacf, 0xe5d1929ef90898fb},
1023
0
      {0x8df5efabc5979c8f, 0xca8d3ffa1ef463c2},
1024
0
      {0xe55990879ddcaabd, 0xcc420a6a101d0516},
1025
0
      {0xb94470938fa89bce, 0xf808e40e8d5b3e6a},
1026
0
      {0x95a8637627989aad, 0xdde7001379a44aa9},
1027
0
      {0xf1c90080baf72cb1, 0x5324c68b12dd6339},
1028
0
      {0xc350000000000000, 0x0000000000000000},
1029
0
      {0x9dc5ada82b70b59d, 0xf020000000000000},
1030
0
      {0xfee50b7025c36a08, 0x02f236d04753d5b5},
1031
0
      {0xcde6fd5e09abcf26, 0xed4c0226b55e6f87},
1032
0
      {0xa6539930bf6bff45, 0x84db8346b786151d},
1033
0
      {0x865b86925b9bc5c2, 0x0b8a2392ba45a9b3},
1034
0
      {0xd910f7ff28069da4, 0x1b2ba1518094da05},
1035
0
      {0xaf58416654a6babb, 0x387ac8d1970027b3},
1036
0
      {0x8da471a9de737e24, 0x5ceaecfed289e5d3},
1037
0
      {0xe4d5e82392a40515, 0x0fabaf3feaa5334b},
1038
0
      {0xb8da1662e7b00a17, 0x3d6a751f3b936244},
1039
0
      {0x95527a5202df0ccb, 0x0f37801e0c43ebc9},
1040
0
      {0xf13e34aabb430a15, 0x647726b9e7c68ff0}
1041
0
#endif
1042
0
    };
1043
1044
#if FMT_USE_FULL_CACHE_DRAGONBOX
1045
    return pow10_significands[k - float_info<double>::min_k];
1046
#else
1047
0
    static constexpr uint64_t powers_of_5_64[] = {
1048
0
        0x0000000000000001, 0x0000000000000005, 0x0000000000000019,
1049
0
        0x000000000000007d, 0x0000000000000271, 0x0000000000000c35,
1050
0
        0x0000000000003d09, 0x000000000001312d, 0x000000000005f5e1,
1051
0
        0x00000000001dcd65, 0x00000000009502f9, 0x0000000002e90edd,
1052
0
        0x000000000e8d4a51, 0x0000000048c27395, 0x000000016bcc41e9,
1053
0
        0x000000071afd498d, 0x0000002386f26fc1, 0x000000b1a2bc2ec5,
1054
0
        0x000003782dace9d9, 0x00001158e460913d, 0x000056bc75e2d631,
1055
0
        0x0001b1ae4d6e2ef5, 0x000878678326eac9, 0x002a5a058fc295ed,
1056
0
        0x00d3c21bcecceda1, 0x0422ca8b0a00a425, 0x14adf4b7320334b9};
1057
1058
0
    static const int compression_ratio = 27;
1059
1060
    // Compute base index.
1061
0
    int cache_index = (k - float_info<double>::min_k) / compression_ratio;
1062
0
    int kb = cache_index * compression_ratio + float_info<double>::min_k;
1063
0
    int offset = k - kb;
1064
1065
    // Get base cache.
1066
0
    uint128_fallback base_cache = pow10_significands[cache_index];
1067
0
    if (offset == 0) return base_cache;
1068
1069
    // Compute the required amount of bit-shift.
1070
0
    int alpha = floor_log2_pow10(kb + offset) - floor_log2_pow10(kb) - offset;
1071
0
    FMT_ASSERT(alpha > 0 && alpha < 64, "shifting error detected");
1072
1073
    // Try to recover the real cache.
1074
0
    uint64_t pow5 = powers_of_5_64[offset];
1075
0
    uint128_fallback recovered_cache = umul128(base_cache.high(), pow5);
1076
0
    uint128_fallback middle_low = umul128(base_cache.low(), pow5);
1077
1078
0
    recovered_cache += middle_low.high();
1079
1080
0
    uint64_t high_to_middle = recovered_cache.high() << (64 - alpha);
1081
0
    uint64_t middle_to_low = recovered_cache.low() << (64 - alpha);
1082
1083
0
    recovered_cache =
1084
0
        uint128_fallback{(recovered_cache.low() >> alpha) | high_to_middle,
1085
0
                         ((middle_low.low() >> alpha) | middle_to_low)};
1086
0
    FMT_ASSERT(recovered_cache.low() + 1 != 0, "");
1087
0
    return {recovered_cache.high(), recovered_cache.low() + 1};
1088
0
#endif
1089
0
  }
1090
1091
  struct compute_mul_result {
1092
    carrier_uint result;
1093
    bool is_integer;
1094
  };
1095
  struct compute_mul_parity_result {
1096
    bool parity;
1097
    bool is_integer;
1098
  };
1099
1100
  static auto compute_mul(carrier_uint u,
1101
                          const cache_entry_type& cache) noexcept
1102
0
      -> compute_mul_result {
1103
0
    auto r = umul192_upper128(u, cache);
1104
0
    return {r.high(), r.low() == 0};
1105
0
  }
1106
1107
  static auto compute_delta(const cache_entry_type& cache, int beta) noexcept
1108
0
      -> uint32_t {
1109
0
    return static_cast<uint32_t>(cache.high() >> (64 - 1 - beta));
1110
0
  }
1111
1112
  static auto compute_mul_parity(carrier_uint two_f,
1113
                                 const cache_entry_type& cache,
1114
                                 int beta) noexcept
1115
0
      -> compute_mul_parity_result {
1116
0
    FMT_ASSERT(beta >= 1, "");
1117
0
    FMT_ASSERT(beta < 64, "");
1118
1119
0
    auto r = umul192_lower128(two_f, cache);
1120
0
    return {((r.high() >> (64 - beta)) & 1) != 0,
1121
0
            ((r.high() << beta) | (r.low() >> (64 - beta))) == 0};
1122
0
  }
1123
1124
  static auto compute_left_endpoint_for_shorter_interval_case(
1125
0
      const cache_entry_type& cache, int beta) noexcept -> carrier_uint {
1126
0
    return (cache.high() -
1127
0
            (cache.high() >> (num_significand_bits<double>() + 2))) >>
1128
0
           (64 - num_significand_bits<double>() - 1 - beta);
1129
0
  }
1130
1131
  static auto compute_right_endpoint_for_shorter_interval_case(
1132
0
      const cache_entry_type& cache, int beta) noexcept -> carrier_uint {
1133
0
    return (cache.high() +
1134
0
            (cache.high() >> (num_significand_bits<double>() + 1))) >>
1135
0
           (64 - num_significand_bits<double>() - 1 - beta);
1136
0
  }
1137
1138
  static auto compute_round_up_for_shorter_interval_case(
1139
0
      const cache_entry_type& cache, int beta) noexcept -> carrier_uint {
1140
0
    return ((cache.high() >> (64 - num_significand_bits<double>() - 2 - beta)) +
1141
0
            1) /
1142
0
           2;
1143
0
  }
1144
};
1145
1146
0
FMT_FUNC auto get_cached_power(int k) noexcept -> uint128_fallback {
1147
0
  return cache_accessor<double>::get_cached_power(k);
1148
0
}
1149
1150
// Various integer checks
1151
template <typename T>
1152
0
auto is_left_endpoint_integer_shorter_interval(int exponent) noexcept -> bool {
1153
0
  const int case_shorter_interval_left_endpoint_lower_threshold = 2;
1154
0
  const int case_shorter_interval_left_endpoint_upper_threshold = 3;
1155
0
  return exponent >= case_shorter_interval_left_endpoint_lower_threshold &&
1156
0
         exponent <= case_shorter_interval_left_endpoint_upper_threshold;
1157
0
}
Unexecuted instantiation: bool fmt::v12::detail::dragonbox::is_left_endpoint_integer_shorter_interval<float>(int)
Unexecuted instantiation: bool fmt::v12::detail::dragonbox::is_left_endpoint_integer_shorter_interval<double>(int)
1158
1159
// Remove trailing zeros from n and return the number of zeros removed (float).
1160
0
FMT_INLINE auto remove_trailing_zeros(uint32_t& n, int s = 0) noexcept -> int {
1161
0
  FMT_ASSERT(n != 0, "");
1162
  // Modular inverse of 5 (mod 2^32): (mod_inv_5 * 5) mod 2^32 = 1.
1163
0
  constexpr uint32_t mod_inv_5 = 0xcccccccd;
1164
0
  constexpr uint32_t mod_inv_25 = 0xc28f5c29;  // = mod_inv_5 * mod_inv_5
1165
1166
0
  while (true) {
1167
0
    auto q = rotr(n * mod_inv_25, 2);
1168
0
    if (q > max_value<uint32_t>() / 100) break;
1169
0
    n = q;
1170
0
    s += 2;
1171
0
  }
1172
0
  auto q = rotr(n * mod_inv_5, 1);
1173
0
  if (q <= max_value<uint32_t>() / 10) {
1174
0
    n = q;
1175
0
    s |= 1;
1176
0
  }
1177
0
  return s;
1178
0
}
1179
1180
// Removes trailing zeros and returns the number of zeros removed (double).
1181
0
FMT_INLINE auto remove_trailing_zeros(uint64_t& n) noexcept -> int {
1182
0
  FMT_ASSERT(n != 0, "");
1183
1184
  // Is n is divisible by 10^8?
1185
0
  constexpr uint32_t ten_pow_8 = 100000000u;
1186
0
  if ((n % ten_pow_8) == 0) {
1187
    // If yes, work with the quotient...
1188
0
    auto n32 = static_cast<uint32_t>(n / ten_pow_8);
1189
    // ... and use the 32 bit variant of the function
1190
0
    int num_zeros = remove_trailing_zeros(n32, 8);
1191
0
    n = n32;
1192
0
    return num_zeros;
1193
0
  }
1194
1195
  // If n is not divisible by 10^8, work with n itself.
1196
0
  constexpr uint64_t mod_inv_5 = 0xcccccccccccccccd;
1197
0
  constexpr uint64_t mod_inv_25 = 0x8f5c28f5c28f5c29;  // mod_inv_5 * mod_inv_5
1198
1199
0
  int s = 0;
1200
0
  while (true) {
1201
0
    auto q = rotr(n * mod_inv_25, 2);
1202
0
    if (q > max_value<uint64_t>() / 100) break;
1203
0
    n = q;
1204
0
    s += 2;
1205
0
  }
1206
0
  auto q = rotr(n * mod_inv_5, 1);
1207
0
  if (q <= max_value<uint64_t>() / 10) {
1208
0
    n = q;
1209
0
    s |= 1;
1210
0
  }
1211
1212
0
  return s;
1213
0
}
1214
1215
// The main algorithm for shorter interval case
1216
template <typename T>
1217
0
FMT_INLINE auto shorter_interval_case(int exponent) noexcept -> decimal_fp<T> {
1218
0
  decimal_fp<T> ret_value;
1219
  // Compute k and beta
1220
0
  const int minus_k = floor_log10_pow2_minus_log10_4_over_3(exponent);
1221
0
  const int beta = exponent + floor_log2_pow10(-minus_k);
1222
1223
  // Compute xi and zi
1224
0
  using cache_entry_type = typename cache_accessor<T>::cache_entry_type;
1225
0
  const cache_entry_type cache = cache_accessor<T>::get_cached_power(-minus_k);
1226
1227
0
  auto xi = cache_accessor<T>::compute_left_endpoint_for_shorter_interval_case(
1228
0
      cache, beta);
1229
0
  auto zi = cache_accessor<T>::compute_right_endpoint_for_shorter_interval_case(
1230
0
      cache, beta);
1231
1232
  // If the left endpoint is not an integer, increase it
1233
0
  if (!is_left_endpoint_integer_shorter_interval<T>(exponent)) ++xi;
1234
1235
  // Try bigger divisor
1236
0
  ret_value.significand = zi / 10;
1237
1238
  // If succeed, remove trailing zeros if necessary and return
1239
0
  if (ret_value.significand * 10 >= xi) {
1240
0
    ret_value.exponent = minus_k + 1;
1241
0
    ret_value.exponent += remove_trailing_zeros(ret_value.significand);
1242
0
    return ret_value;
1243
0
  }
1244
1245
  // Otherwise, compute the round-up of y
1246
0
  ret_value.significand =
1247
0
      cache_accessor<T>::compute_round_up_for_shorter_interval_case(cache,
1248
0
                                                                    beta);
1249
0
  ret_value.exponent = minus_k;
1250
1251
  // When tie occurs, choose one of them according to the rule
1252
0
  if (exponent >= float_info<T>::shorter_interval_tie_lower_threshold &&
1253
0
      exponent <= float_info<T>::shorter_interval_tie_upper_threshold) {
1254
0
    ret_value.significand = ret_value.significand % 2 == 0
1255
0
                                ? ret_value.significand
1256
0
                                : ret_value.significand - 1;
1257
0
  } else if (ret_value.significand < xi) {
1258
0
    ++ret_value.significand;
1259
0
  }
1260
0
  return ret_value;
1261
0
}
Unexecuted instantiation: fmt::v12::detail::dragonbox::decimal_fp<float> fmt::v12::detail::dragonbox::shorter_interval_case<float>(int)
Unexecuted instantiation: fmt::v12::detail::dragonbox::decimal_fp<double> fmt::v12::detail::dragonbox::shorter_interval_case<double>(int)
1262
1263
0
template <typename T> auto to_decimal(T x) noexcept -> decimal_fp<T> {
1264
  // Step 1: integer promotion & Schubfach multiplier calculation.
1265
1266
0
  using carrier_uint = typename float_info<T>::carrier_uint;
1267
0
  using cache_entry_type = typename cache_accessor<T>::cache_entry_type;
1268
0
  auto br = bit_cast<carrier_uint>(x);
1269
1270
  // Extract significand bits and exponent bits.
1271
0
  const carrier_uint significand_mask =
1272
0
      (static_cast<carrier_uint>(1) << num_significand_bits<T>()) - 1;
1273
0
  carrier_uint significand = (br & significand_mask);
1274
0
  int exponent =
1275
0
      static_cast<int>((br & exponent_mask<T>()) >> num_significand_bits<T>());
1276
1277
0
  if (exponent != 0) {  // Check if normal.
1278
0
    exponent -= exponent_bias<T>() + num_significand_bits<T>();
1279
1280
    // Shorter interval case; proceed like Schubfach.
1281
    // In fact, when exponent == 1 and significand == 0, the interval is
1282
    // regular. However, it can be shown that the end-results are anyway same.
1283
0
    if (significand == 0) return shorter_interval_case<T>(exponent);
1284
1285
0
    significand |= (static_cast<carrier_uint>(1) << num_significand_bits<T>());
1286
0
  } else {
1287
    // Subnormal case; the interval is always regular.
1288
0
    if (significand == 0) return {0, 0};
1289
0
    exponent =
1290
0
        std::numeric_limits<T>::min_exponent - num_significand_bits<T>() - 1;
1291
0
  }
1292
1293
0
  const bool include_left_endpoint = (significand % 2 == 0);
1294
0
  const bool include_right_endpoint = include_left_endpoint;
1295
1296
  // Compute k and beta.
1297
0
  const int minus_k = floor_log10_pow2(exponent) - float_info<T>::kappa;
1298
0
  const cache_entry_type cache = cache_accessor<T>::get_cached_power(-minus_k);
1299
0
  const int beta = exponent + floor_log2_pow10(-minus_k);
1300
1301
  // Compute zi and deltai.
1302
  // 10^kappa <= deltai < 10^(kappa + 1)
1303
0
  const uint32_t deltai = cache_accessor<T>::compute_delta(cache, beta);
1304
0
  const carrier_uint two_fc = significand << 1;
1305
1306
  // For the case of binary32, the result of integer check is not correct for
1307
  // 29711844 * 2^-82
1308
  // = 6.1442653300000000008655037797566933477355632930994033813476... * 10^-18
1309
  // and 29711844 * 2^-81
1310
  // = 1.2288530660000000001731007559513386695471126586198806762695... * 10^-17,
1311
  // and they are the unique counterexamples. However, since 29711844 is even,
1312
  // this does not cause any problem for the endpoints calculations; it can only
1313
  // cause a problem when we need to perform integer check for the center.
1314
  // Fortunately, with these inputs, that branch is never executed, so we are
1315
  // fine.
1316
0
  const typename cache_accessor<T>::compute_mul_result z_mul =
1317
0
      cache_accessor<T>::compute_mul((two_fc | 1) << beta, cache);
1318
1319
  // Step 2: Try larger divisor; remove trailing zeros if necessary.
1320
1321
  // Using an upper bound on zi, we might be able to optimize the division
1322
  // better than the compiler; we are computing zi / big_divisor here.
1323
0
  decimal_fp<T> ret_value;
1324
0
  ret_value.significand = divide_by_10_to_kappa_plus_1(z_mul.result);
1325
0
  uint32_t r = static_cast<uint32_t>(z_mul.result - float_info<T>::big_divisor *
1326
0
                                                        ret_value.significand);
1327
1328
0
  if (r < deltai) {
1329
    // Exclude the right endpoint if necessary.
1330
0
    if (r == 0 && (z_mul.is_integer & !include_right_endpoint)) {
1331
0
      --ret_value.significand;
1332
0
      r = float_info<T>::big_divisor;
1333
0
      goto small_divisor_case_label;
1334
0
    }
1335
0
  } else if (r > deltai) {
1336
0
    goto small_divisor_case_label;
1337
0
  } else {
1338
    // r == deltai; compare fractional parts.
1339
0
    const typename cache_accessor<T>::compute_mul_parity_result x_mul =
1340
0
        cache_accessor<T>::compute_mul_parity(two_fc - 1, cache, beta);
1341
1342
0
    if (!(x_mul.parity | (x_mul.is_integer & include_left_endpoint)))
1343
0
      goto small_divisor_case_label;
1344
0
  }
1345
0
  ret_value.exponent = minus_k + float_info<T>::kappa + 1;
1346
1347
  // We may need to remove trailing zeros.
1348
0
  ret_value.exponent += remove_trailing_zeros(ret_value.significand);
1349
0
  return ret_value;
1350
1351
  // Step 3: Find the significand with the smaller divisor.
1352
1353
0
small_divisor_case_label:
1354
0
  ret_value.significand *= 10;
1355
0
  ret_value.exponent = minus_k + float_info<T>::kappa;
1356
1357
0
  uint32_t dist = r - (deltai / 2) + (float_info<T>::small_divisor / 2);
1358
0
  const bool approx_y_parity =
1359
0
      ((dist ^ (float_info<T>::small_divisor / 2)) & 1) != 0;
1360
1361
  // Is dist divisible by 10^kappa?
1362
0
  const bool divisible_by_small_divisor =
1363
0
      check_divisibility_and_divide_by_pow10<float_info<T>::kappa>(dist);
1364
1365
  // Add dist / 10^kappa to the significand.
1366
0
  ret_value.significand += dist;
1367
1368
0
  if (!divisible_by_small_divisor) return ret_value;
1369
1370
  // Check z^(f) >= epsilon^(f).
1371
  // We have either yi == zi - epsiloni or yi == (zi - epsiloni) - 1,
1372
  // where yi == zi - epsiloni if and only if z^(f) >= epsilon^(f).
1373
  // Since there are only 2 possibilities, we only need to care about the
1374
  // parity. Also, zi and r should have the same parity since the divisor
1375
  // is an even number.
1376
0
  const auto y_mul = cache_accessor<T>::compute_mul_parity(two_fc, cache, beta);
1377
1378
  // If z^(f) >= epsilon^(f), we might have a tie when z^(f) == epsilon^(f),
1379
  // or equivalently, when y is an integer.
1380
0
  if (y_mul.parity != approx_y_parity)
1381
0
    --ret_value.significand;
1382
0
  else if (y_mul.is_integer & (ret_value.significand % 2 != 0))
1383
0
    --ret_value.significand;
1384
0
  return ret_value;
1385
0
}
Unexecuted instantiation: fmt::v12::detail::dragonbox::decimal_fp<float> fmt::v12::detail::dragonbox::to_decimal<float>(float)
Unexecuted instantiation: fmt::v12::detail::dragonbox::decimal_fp<double> fmt::v12::detail::dragonbox::to_decimal<double>(double)
1386
}  // namespace dragonbox
1387
}  // namespace detail
1388
1389
template <> struct formatter<detail::bigint> {
1390
  FMT_CONSTEXPR auto parse(format_parse_context& ctx)
1391
0
      -> format_parse_context::iterator {
1392
0
    return ctx.begin();
1393
0
  }
1394
1395
  auto format(const detail::bigint& n, format_context& ctx) const
1396
0
      -> format_context::iterator {
1397
0
    auto out = ctx.out();
1398
0
    bool first = true;
1399
0
    for (auto i = n.bigits_.size(); i > 0; --i) {
1400
0
      auto value = n.bigits_[i - 1u];
1401
0
      if (first) {
1402
0
        out = fmt::format_to(out, FMT_STRING("{:x}"), value);
1403
0
        first = false;
1404
0
        continue;
1405
0
      }
1406
0
      out = fmt::format_to(out, FMT_STRING("{:08x}"), value);
1407
0
    }
1408
0
    if (n.exp_ > 0)
1409
0
      out = fmt::format_to(out, FMT_STRING("p{}"),
1410
0
                           n.exp_ * detail::bigint::bigit_bits);
1411
0
    return out;
1412
0
  }
1413
};
1414
1415
FMT_FUNC detail::utf8_to_utf16::utf8_to_utf16(string_view s) {
1416
  for_each_codepoint(s, [this](uint32_t cp, string_view) {
1417
    if (cp == invalid_code_point) FMT_THROW(std::runtime_error("invalid utf8"));
1418
    if (cp <= 0xFFFF) {
1419
      buffer_.push_back(static_cast<wchar_t>(cp));
1420
    } else {
1421
      cp -= 0x10000;
1422
      buffer_.push_back(static_cast<wchar_t>(0xD800 + (cp >> 10)));
1423
      buffer_.push_back(static_cast<wchar_t>(0xDC00 + (cp & 0x3FF)));
1424
    }
1425
    return true;
1426
  });
1427
  buffer_.push_back(0);
1428
}
1429
1430
FMT_FUNC void format_system_error(detail::buffer<char>& out, int error_code,
1431
0
                                  const char* message) noexcept {
1432
0
  FMT_TRY {
1433
0
    auto ec = std::error_code(error_code, std::generic_category());
1434
0
    detail::write(appender(out), std::system_error(ec, message).what());
1435
0
    return;
1436
0
  }
1437
0
  FMT_CATCH(...) {}
1438
0
  format_error_code(out, error_code, message);
1439
0
}
1440
1441
FMT_FUNC void report_system_error(int error_code,
1442
0
                                  const char* message) noexcept {
1443
0
  do_report_error(format_system_error, error_code, message);
1444
0
}
1445
1446
10.9k
FMT_FUNC auto vformat(string_view fmt, format_args args) -> std::string {
1447
  // Don't optimize the "{}" case to keep the binary size small and because it
1448
  // can be better optimized in fmt::format anyway.
1449
10.9k
  auto buffer = memory_buffer();
1450
10.9k
  detail::vformat_to(buffer, fmt, args);
1451
10.9k
  return to_string(buffer);
1452
10.9k
}
1453
1454
namespace detail {
1455
1456
FMT_FUNC void vformat_to(buffer<char>& buf, string_view fmt, format_args args,
1457
40.5k
                         locale_ref loc) {
1458
40.5k
  auto out = appender(buf);
1459
40.5k
  if (fmt.size() == 2 && equal2(fmt.data(), "{}"))
1460
832
    return args.get(0).visit(default_arg_formatter<char>{out});
1461
39.7k
  parse_format_string(fmt,
1462
39.7k
                      format_handler<>{parse_context<>(fmt), {out, args, loc}});
1463
39.7k
}
1464
1465
template <typename T> struct span {
1466
  T* data;
1467
  size_t size;
1468
};
1469
1470
template <typename F> auto flockfile(F* f) -> decltype(_lock_file(f)) {
1471
  _lock_file(f);
1472
}
1473
template <typename F> auto funlockfile(F* f) -> decltype(_unlock_file(f)) {
1474
  _unlock_file(f);
1475
}
1476
1477
#ifndef getc_unlocked
1478
template <typename F> auto getc_unlocked(F* f) -> decltype(_fgetc_nolock(f)) {
1479
  return _fgetc_nolock(f);
1480
}
1481
#endif
1482
1483
template <typename F = FILE, typename Enable = void>
1484
struct has_flockfile : std::false_type {};
1485
1486
template <typename F>
1487
struct has_flockfile<F, void_t<decltype(flockfile(&std::declval<F&>()))>>
1488
    : std::true_type {};
1489
1490
// A FILE wrapper. F is FILE defined as a template parameter to make system API
1491
// detection work.
1492
template <typename F> class file_base {
1493
 public:
1494
  F* file_;
1495
1496
 public:
1497
  file_base(F* file) : file_(file) {}
1498
0
  operator F*() const { return file_; }
1499
1500
  // Reads a code unit from the stream.
1501
  auto get() -> int {
1502
    int result = getc_unlocked(file_);
1503
    if (result == EOF && ferror(file_) != 0)
1504
      FMT_THROW(system_error(errno, FMT_STRING("getc failed")));
1505
    return result;
1506
  }
1507
1508
  // Puts the code unit back into the stream buffer.
1509
  void unget(char c) {
1510
    if (ungetc(c, file_) == EOF)
1511
      FMT_THROW(system_error(errno, FMT_STRING("ungetc failed")));
1512
  }
1513
1514
  void flush() { fflush(this->file_); }
1515
};
1516
1517
// A FILE wrapper for glibc.
1518
template <typename F> class glibc_file : public file_base<F> {
1519
 private:
1520
  enum {
1521
    line_buffered = 0x200,  // _IO_LINE_BUF
1522
    unbuffered = 2          // _IO_UNBUFFERED
1523
  };
1524
1525
 public:
1526
  using file_base<F>::file_base;
1527
1528
0
  auto is_buffered() const -> bool {
1529
0
    return (this->file_->_flags & unbuffered) == 0;
1530
0
  }
1531
1532
0
  void init_buffer() {
1533
0
    if (this->file_->_IO_write_ptr < this->file_->_IO_write_end) return;
1534
0
    // Force buffer initialization by placing and removing a char in a buffer.
1535
0
    putc_unlocked(0, this->file_);
1536
0
    --this->file_->_IO_write_ptr;
1537
0
  }
1538
1539
  // Returns the file's read buffer.
1540
  auto get_read_buffer() const -> span<const char> {
1541
    auto ptr = this->file_->_IO_read_ptr;
1542
    return {ptr, to_unsigned(this->file_->_IO_read_end - ptr)};
1543
  }
1544
1545
  // Returns the file's write buffer.
1546
0
  auto get_write_buffer() const -> span<char> {
1547
0
    auto ptr = this->file_->_IO_write_ptr;
1548
0
    return {ptr, to_unsigned(this->file_->_IO_buf_end - ptr)};
1549
0
  }
1550
1551
0
  void advance_write_buffer(size_t size) { this->file_->_IO_write_ptr += size; }
1552
1553
0
  auto needs_flush() const -> bool {
1554
0
    if ((this->file_->_flags & line_buffered) == 0) return false;
1555
0
    char* end = this->file_->_IO_write_end;
1556
0
    auto size = max_of<ptrdiff_t>(this->file_->_IO_write_ptr - end, 0);
1557
0
    return memchr(end, '\n', static_cast<size_t>(size));
1558
0
  }
1559
1560
0
  void flush() { fflush_unlocked(this->file_); }
1561
};
1562
1563
// A FILE wrapper for Apple's libc.
1564
template <typename F> class apple_file : public file_base<F> {
1565
 private:
1566
  enum {
1567
    line_buffered = 1,  // __SNBF
1568
    unbuffered = 2      // __SLBF
1569
  };
1570
1571
 public:
1572
  using file_base<F>::file_base;
1573
1574
  auto is_buffered() const -> bool {
1575
    return (this->file_->_flags & unbuffered) == 0;
1576
  }
1577
1578
  void init_buffer() {
1579
    if (this->file_->_p) return;
1580
    // Force buffer initialization by placing and removing a char in a buffer.
1581
    if (!FMT_CLANG_ANALYZER) putc_unlocked(0, this->file_);
1582
    --this->file_->_p;
1583
    ++this->file_->_w;
1584
  }
1585
1586
  auto get_read_buffer() const -> span<const char> {
1587
    return {reinterpret_cast<char*>(this->file_->_p),
1588
            to_unsigned(this->file_->_r)};
1589
  }
1590
1591
  auto get_write_buffer() const -> span<char> {
1592
    return {reinterpret_cast<char*>(this->file_->_p),
1593
            to_unsigned(this->file_->_bf._base + this->file_->_bf._size -
1594
                        this->file_->_p)};
1595
  }
1596
1597
  void advance_write_buffer(size_t size) {
1598
    this->file_->_p += size;
1599
    this->file_->_w -= size;
1600
  }
1601
1602
  auto needs_flush() const -> bool {
1603
    if ((this->file_->_flags & line_buffered) == 0) return false;
1604
    return memchr(this->file_->_p + this->file_->_w, '\n',
1605
                  to_unsigned(-this->file_->_w));
1606
  }
1607
};
1608
1609
// A fallback FILE wrapper.
1610
template <typename F> class fallback_file : public file_base<F> {
1611
 private:
1612
  char next_;  // The next unconsumed character in the buffer.
1613
  bool has_next_ = false;
1614
1615
 public:
1616
  using file_base<F>::file_base;
1617
1618
  auto is_buffered() const -> bool { return false; }
1619
  auto needs_flush() const -> bool { return false; }
1620
  void init_buffer() {}
1621
1622
  auto get_read_buffer() const -> span<const char> {
1623
    return {&next_, has_next_ ? 1u : 0u};
1624
  }
1625
1626
  auto get_write_buffer() const -> span<char> { return {nullptr, 0}; }
1627
1628
  void advance_write_buffer(size_t) {}
1629
1630
  auto get() -> int {
1631
    has_next_ = false;
1632
    return file_base<F>::get();
1633
  }
1634
1635
  void unget(char c) {
1636
    file_base<F>::unget(c);
1637
    next_ = c;
1638
    has_next_ = true;
1639
  }
1640
};
1641
1642
#ifndef FMT_USE_FALLBACK_FILE
1643
#  define FMT_USE_FALLBACK_FILE 0
1644
#endif
1645
1646
template <typename F,
1647
          FMT_ENABLE_IF(sizeof(F::_p) != 0 && !FMT_USE_FALLBACK_FILE)>
1648
auto get_file(F* f, int) -> apple_file<F> {
1649
  return f;
1650
}
1651
template <typename F,
1652
          FMT_ENABLE_IF(sizeof(F::_IO_read_ptr) != 0 && !FMT_USE_FALLBACK_FILE)>
1653
inline auto get_file(F* f, int) -> glibc_file<F> {
1654
  return f;
1655
}
1656
1657
0
inline auto get_file(FILE* f, ...) -> fallback_file<FILE> { return f; }
1658
1659
using file_ref = decltype(get_file(static_cast<FILE*>(nullptr), 0));
1660
1661
template <typename F = FILE, typename Enable = void>
1662
class file_print_buffer : public buffer<char> {
1663
 public:
1664
  explicit file_print_buffer(F*) : buffer(nullptr, size_t()) {}
1665
};
1666
1667
template <typename F>
1668
class file_print_buffer<F, enable_if_t<has_flockfile<F>::value>>
1669
    : public buffer<char> {
1670
 private:
1671
  file_ref file_;
1672
1673
0
  static void grow(buffer<char>& base, size_t) {
1674
0
    auto& self = static_cast<file_print_buffer&>(base);
1675
0
    self.file_.advance_write_buffer(self.size());
1676
0
    if (self.file_.get_write_buffer().size == 0) self.file_.flush();
1677
0
    auto buf = self.file_.get_write_buffer();
1678
0
    FMT_ASSERT(buf.size > 0, "");
1679
0
    self.set(buf.data, buf.size);
1680
0
    self.clear();
1681
0
  }
1682
1683
 public:
1684
  explicit file_print_buffer(F* f) : buffer(grow, size_t()), file_(f) {
1685
    flockfile(f);
1686
    file_.init_buffer();
1687
    auto buf = file_.get_write_buffer();
1688
    set(buf.data, buf.size);
1689
  }
1690
  ~file_print_buffer() {
1691
    file_.advance_write_buffer(size());
1692
    bool flush = file_.needs_flush();
1693
    F* f = file_;    // Make funlockfile depend on the template parameter F
1694
    funlockfile(f);  // for the system API detection to work.
1695
    if (flush) fflush(file_);
1696
  }
1697
};
1698
1699
#if !defined(_WIN32) || defined(FMT_USE_WRITE_CONSOLE)
1700
0
FMT_FUNC auto write_console(int, string_view) -> bool { return false; }
1701
#else
1702
using dword = conditional_t<sizeof(long) == 4, unsigned long, unsigned>;
1703
extern "C" __declspec(dllimport) int __stdcall WriteConsoleW(  //
1704
    void*, const void*, dword, dword*, void*);
1705
1706
FMT_FUNC bool write_console(int fd, string_view text) {
1707
  auto u16 = utf8_to_utf16(text);
1708
  return WriteConsoleW(reinterpret_cast<void*>(_get_osfhandle(fd)), u16.c_str(),
1709
                       static_cast<dword>(u16.size()), nullptr, nullptr) != 0;
1710
}
1711
#endif
1712
1713
#ifdef _WIN32
1714
// Print assuming legacy (non-Unicode) encoding.
1715
FMT_FUNC void vprint_mojibake(std::FILE* f, string_view fmt, format_args args,
1716
                              bool newline) {
1717
  auto buffer = memory_buffer();
1718
  detail::vformat_to(buffer, fmt, args);
1719
  if (newline) buffer.push_back('\n');
1720
  fwrite_all(buffer.data(), buffer.size(), f);
1721
}
1722
#endif
1723
1724
0
FMT_FUNC void print(std::FILE* f, string_view text) {
1725
0
#if defined(_WIN32) && !defined(FMT_USE_WRITE_CONSOLE)
1726
0
  int fd = _fileno(f);
1727
0
  if (_isatty(fd)) {
1728
0
    std::fflush(f);
1729
0
    if (write_console(fd, text)) return;
1730
0
  }
1731
0
#endif
1732
0
  fwrite_all(text.data(), text.size(), f);
1733
0
}
1734
}  // namespace detail
1735
1736
0
FMT_FUNC void vprint_buffered(std::FILE* f, string_view fmt, format_args args) {
1737
0
  auto buffer = memory_buffer();
1738
0
  detail::vformat_to(buffer, fmt, args);
1739
0
  detail::print(f, {buffer.data(), buffer.size()});
1740
0
}
1741
1742
0
FMT_FUNC void vprint(std::FILE* f, string_view fmt, format_args args) {
1743
0
  if (!detail::file_ref(f).is_buffered() || !detail::has_flockfile<>())
1744
0
    return vprint_buffered(f, fmt, args);
1745
0
  auto&& buffer = detail::file_print_buffer<>(f);
1746
0
  return detail::vformat_to(buffer, fmt, args);
1747
0
}
1748
1749
0
FMT_FUNC void vprintln(std::FILE* f, string_view fmt, format_args args) {
1750
0
  auto buffer = memory_buffer();
1751
0
  detail::vformat_to(buffer, fmt, args);
1752
0
  buffer.push_back('\n');
1753
0
  detail::print(f, {buffer.data(), buffer.size()});
1754
0
}
1755
1756
0
FMT_FUNC void vprint(string_view fmt, format_args args) {
1757
0
  vprint(stdout, fmt, args);
1758
0
}
1759
1760
namespace detail {
1761
1762
struct singleton {
1763
  unsigned char upper;
1764
  unsigned char lower_count;
1765
};
1766
1767
inline auto is_printable(uint16_t x, const singleton* singletons,
1768
                         size_t singletons_size,
1769
                         const unsigned char* singleton_lowers,
1770
                         const unsigned char* normal, size_t normal_size)
1771
91.4M
    -> bool {
1772
91.4M
  auto upper = x >> 8;
1773
91.4M
  auto lower_start = 0;
1774
204M
  for (size_t i = 0; i < singletons_size; ++i) {
1775
204M
    auto s = singletons[i];
1776
204M
    auto lower_end = lower_start + s.lower_count;
1777
204M
    if (upper < s.upper) break;
1778
113M
    if (upper == s.upper) {
1779
183M
      for (auto j = lower_start; j < lower_end; ++j) {
1780
92.8M
        if (singleton_lowers[j] == (x & 0xff)) return false;
1781
92.8M
      }
1782
91.1M
    }
1783
113M
    lower_start = lower_end;
1784
113M
  }
1785
1786
91.1M
  auto xsigned = static_cast<int>(x);
1787
91.1M
  auto current = true;
1788
408M
  for (size_t i = 0; i < normal_size; ++i) {
1789
408M
    auto v = static_cast<int>(normal[i]);
1790
408M
    auto len = (v & 0x80) != 0 ? (v & 0x7f) << 8 | normal[++i] : v;
1791
408M
    xsigned -= len;
1792
408M
    if (xsigned < 0) break;
1793
317M
    current = !current;
1794
317M
  }
1795
91.1M
  return current;
1796
91.4M
}
1797
1798
// This code is generated by support/printable.py.
1799
136M
FMT_FUNC auto is_printable(uint32_t cp) -> bool {
1800
136M
  static constexpr singleton singletons0[] = {
1801
136M
      {0x00, 1},  {0x03, 5},  {0x05, 6},  {0x06, 3},  {0x07, 6},  {0x08, 8},
1802
136M
      {0x09, 17}, {0x0a, 28}, {0x0b, 25}, {0x0c, 20}, {0x0d, 16}, {0x0e, 13},
1803
136M
      {0x0f, 4},  {0x10, 3},  {0x12, 18}, {0x13, 9},  {0x16, 1},  {0x17, 5},
1804
136M
      {0x18, 2},  {0x19, 3},  {0x1a, 7},  {0x1c, 2},  {0x1d, 1},  {0x1f, 22},
1805
136M
      {0x20, 3},  {0x2b, 3},  {0x2c, 2},  {0x2d, 11}, {0x2e, 1},  {0x30, 3},
1806
136M
      {0x31, 2},  {0x32, 1},  {0xa7, 2},  {0xa9, 2},  {0xaa, 4},  {0xab, 8},
1807
136M
      {0xfa, 2},  {0xfb, 5},  {0xfd, 4},  {0xfe, 3},  {0xff, 9},
1808
136M
  };
1809
136M
  static constexpr unsigned char singletons0_lower[] = {
1810
136M
      0xad, 0x78, 0x79, 0x8b, 0x8d, 0xa2, 0x30, 0x57, 0x58, 0x8b, 0x8c, 0x90,
1811
136M
      0x1c, 0x1d, 0xdd, 0x0e, 0x0f, 0x4b, 0x4c, 0xfb, 0xfc, 0x2e, 0x2f, 0x3f,
1812
136M
      0x5c, 0x5d, 0x5f, 0xb5, 0xe2, 0x84, 0x8d, 0x8e, 0x91, 0x92, 0xa9, 0xb1,
1813
136M
      0xba, 0xbb, 0xc5, 0xc6, 0xc9, 0xca, 0xde, 0xe4, 0xe5, 0xff, 0x00, 0x04,
1814
136M
      0x11, 0x12, 0x29, 0x31, 0x34, 0x37, 0x3a, 0x3b, 0x3d, 0x49, 0x4a, 0x5d,
1815
136M
      0x84, 0x8e, 0x92, 0xa9, 0xb1, 0xb4, 0xba, 0xbb, 0xc6, 0xca, 0xce, 0xcf,
1816
136M
      0xe4, 0xe5, 0x00, 0x04, 0x0d, 0x0e, 0x11, 0x12, 0x29, 0x31, 0x34, 0x3a,
1817
136M
      0x3b, 0x45, 0x46, 0x49, 0x4a, 0x5e, 0x64, 0x65, 0x84, 0x91, 0x9b, 0x9d,
1818
136M
      0xc9, 0xce, 0xcf, 0x0d, 0x11, 0x29, 0x45, 0x49, 0x57, 0x64, 0x65, 0x8d,
1819
136M
      0x91, 0xa9, 0xb4, 0xba, 0xbb, 0xc5, 0xc9, 0xdf, 0xe4, 0xe5, 0xf0, 0x0d,
1820
136M
      0x11, 0x45, 0x49, 0x64, 0x65, 0x80, 0x84, 0xb2, 0xbc, 0xbe, 0xbf, 0xd5,
1821
136M
      0xd7, 0xf0, 0xf1, 0x83, 0x85, 0x8b, 0xa4, 0xa6, 0xbe, 0xbf, 0xc5, 0xc7,
1822
136M
      0xce, 0xcf, 0xda, 0xdb, 0x48, 0x98, 0xbd, 0xcd, 0xc6, 0xce, 0xcf, 0x49,
1823
136M
      0x4e, 0x4f, 0x57, 0x59, 0x5e, 0x5f, 0x89, 0x8e, 0x8f, 0xb1, 0xb6, 0xb7,
1824
136M
      0xbf, 0xc1, 0xc6, 0xc7, 0xd7, 0x11, 0x16, 0x17, 0x5b, 0x5c, 0xf6, 0xf7,
1825
136M
      0xfe, 0xff, 0x80, 0x0d, 0x6d, 0x71, 0xde, 0xdf, 0x0e, 0x0f, 0x1f, 0x6e,
1826
136M
      0x6f, 0x1c, 0x1d, 0x5f, 0x7d, 0x7e, 0xae, 0xaf, 0xbb, 0xbc, 0xfa, 0x16,
1827
136M
      0x17, 0x1e, 0x1f, 0x46, 0x47, 0x4e, 0x4f, 0x58, 0x5a, 0x5c, 0x5e, 0x7e,
1828
136M
      0x7f, 0xb5, 0xc5, 0xd4, 0xd5, 0xdc, 0xf0, 0xf1, 0xf5, 0x72, 0x73, 0x8f,
1829
136M
      0x74, 0x75, 0x96, 0x2f, 0x5f, 0x26, 0x2e, 0x2f, 0xa7, 0xaf, 0xb7, 0xbf,
1830
136M
      0xc7, 0xcf, 0xd7, 0xdf, 0x9a, 0x40, 0x97, 0x98, 0x30, 0x8f, 0x1f, 0xc0,
1831
136M
      0xc1, 0xce, 0xff, 0x4e, 0x4f, 0x5a, 0x5b, 0x07, 0x08, 0x0f, 0x10, 0x27,
1832
136M
      0x2f, 0xee, 0xef, 0x6e, 0x6f, 0x37, 0x3d, 0x3f, 0x42, 0x45, 0x90, 0x91,
1833
136M
      0xfe, 0xff, 0x53, 0x67, 0x75, 0xc8, 0xc9, 0xd0, 0xd1, 0xd8, 0xd9, 0xe7,
1834
136M
      0xfe, 0xff,
1835
136M
  };
1836
136M
  static constexpr singleton singletons1[] = {
1837
136M
      {0x00, 6},  {0x01, 1}, {0x03, 1},  {0x04, 2}, {0x08, 8},  {0x09, 2},
1838
136M
      {0x0a, 5},  {0x0b, 2}, {0x0e, 4},  {0x10, 1}, {0x11, 2},  {0x12, 5},
1839
136M
      {0x13, 17}, {0x14, 1}, {0x15, 2},  {0x17, 2}, {0x19, 13}, {0x1c, 5},
1840
136M
      {0x1d, 8},  {0x24, 1}, {0x6a, 3},  {0x6b, 2}, {0xbc, 2},  {0xd1, 2},
1841
136M
      {0xd4, 12}, {0xd5, 9}, {0xd6, 2},  {0xd7, 2}, {0xda, 1},  {0xe0, 5},
1842
136M
      {0xe1, 2},  {0xe8, 2}, {0xee, 32}, {0xf0, 4}, {0xf8, 2},  {0xf9, 2},
1843
136M
      {0xfa, 2},  {0xfb, 1},
1844
136M
  };
1845
136M
  static constexpr unsigned char singletons1_lower[] = {
1846
136M
      0x0c, 0x27, 0x3b, 0x3e, 0x4e, 0x4f, 0x8f, 0x9e, 0x9e, 0x9f, 0x06, 0x07,
1847
136M
      0x09, 0x36, 0x3d, 0x3e, 0x56, 0xf3, 0xd0, 0xd1, 0x04, 0x14, 0x18, 0x36,
1848
136M
      0x37, 0x56, 0x57, 0x7f, 0xaa, 0xae, 0xaf, 0xbd, 0x35, 0xe0, 0x12, 0x87,
1849
136M
      0x89, 0x8e, 0x9e, 0x04, 0x0d, 0x0e, 0x11, 0x12, 0x29, 0x31, 0x34, 0x3a,
1850
136M
      0x45, 0x46, 0x49, 0x4a, 0x4e, 0x4f, 0x64, 0x65, 0x5c, 0xb6, 0xb7, 0x1b,
1851
136M
      0x1c, 0x07, 0x08, 0x0a, 0x0b, 0x14, 0x17, 0x36, 0x39, 0x3a, 0xa8, 0xa9,
1852
136M
      0xd8, 0xd9, 0x09, 0x37, 0x90, 0x91, 0xa8, 0x07, 0x0a, 0x3b, 0x3e, 0x66,
1853
136M
      0x69, 0x8f, 0x92, 0x6f, 0x5f, 0xee, 0xef, 0x5a, 0x62, 0x9a, 0x9b, 0x27,
1854
136M
      0x28, 0x55, 0x9d, 0xa0, 0xa1, 0xa3, 0xa4, 0xa7, 0xa8, 0xad, 0xba, 0xbc,
1855
136M
      0xc4, 0x06, 0x0b, 0x0c, 0x15, 0x1d, 0x3a, 0x3f, 0x45, 0x51, 0xa6, 0xa7,
1856
136M
      0xcc, 0xcd, 0xa0, 0x07, 0x19, 0x1a, 0x22, 0x25, 0x3e, 0x3f, 0xc5, 0xc6,
1857
136M
      0x04, 0x20, 0x23, 0x25, 0x26, 0x28, 0x33, 0x38, 0x3a, 0x48, 0x4a, 0x4c,
1858
136M
      0x50, 0x53, 0x55, 0x56, 0x58, 0x5a, 0x5c, 0x5e, 0x60, 0x63, 0x65, 0x66,
1859
136M
      0x6b, 0x73, 0x78, 0x7d, 0x7f, 0x8a, 0xa4, 0xaa, 0xaf, 0xb0, 0xc0, 0xd0,
1860
136M
      0xae, 0xaf, 0x79, 0xcc, 0x6e, 0x6f, 0x93,
1861
136M
  };
1862
136M
  static constexpr unsigned char normal0[] = {
1863
136M
      0x00, 0x20, 0x5f, 0x22, 0x82, 0xdf, 0x04, 0x82, 0x44, 0x08, 0x1b, 0x04,
1864
136M
      0x06, 0x11, 0x81, 0xac, 0x0e, 0x80, 0xab, 0x35, 0x28, 0x0b, 0x80, 0xe0,
1865
136M
      0x03, 0x19, 0x08, 0x01, 0x04, 0x2f, 0x04, 0x34, 0x04, 0x07, 0x03, 0x01,
1866
136M
      0x07, 0x06, 0x07, 0x11, 0x0a, 0x50, 0x0f, 0x12, 0x07, 0x55, 0x07, 0x03,
1867
136M
      0x04, 0x1c, 0x0a, 0x09, 0x03, 0x08, 0x03, 0x07, 0x03, 0x02, 0x03, 0x03,
1868
136M
      0x03, 0x0c, 0x04, 0x05, 0x03, 0x0b, 0x06, 0x01, 0x0e, 0x15, 0x05, 0x3a,
1869
136M
      0x03, 0x11, 0x07, 0x06, 0x05, 0x10, 0x07, 0x57, 0x07, 0x02, 0x07, 0x15,
1870
136M
      0x0d, 0x50, 0x04, 0x43, 0x03, 0x2d, 0x03, 0x01, 0x04, 0x11, 0x06, 0x0f,
1871
136M
      0x0c, 0x3a, 0x04, 0x1d, 0x25, 0x5f, 0x20, 0x6d, 0x04, 0x6a, 0x25, 0x80,
1872
136M
      0xc8, 0x05, 0x82, 0xb0, 0x03, 0x1a, 0x06, 0x82, 0xfd, 0x03, 0x59, 0x07,
1873
136M
      0x15, 0x0b, 0x17, 0x09, 0x14, 0x0c, 0x14, 0x0c, 0x6a, 0x06, 0x0a, 0x06,
1874
136M
      0x1a, 0x06, 0x59, 0x07, 0x2b, 0x05, 0x46, 0x0a, 0x2c, 0x04, 0x0c, 0x04,
1875
136M
      0x01, 0x03, 0x31, 0x0b, 0x2c, 0x04, 0x1a, 0x06, 0x0b, 0x03, 0x80, 0xac,
1876
136M
      0x06, 0x0a, 0x06, 0x21, 0x3f, 0x4c, 0x04, 0x2d, 0x03, 0x74, 0x08, 0x3c,
1877
136M
      0x03, 0x0f, 0x03, 0x3c, 0x07, 0x38, 0x08, 0x2b, 0x05, 0x82, 0xff, 0x11,
1878
136M
      0x18, 0x08, 0x2f, 0x11, 0x2d, 0x03, 0x20, 0x10, 0x21, 0x0f, 0x80, 0x8c,
1879
136M
      0x04, 0x82, 0x97, 0x19, 0x0b, 0x15, 0x88, 0x94, 0x05, 0x2f, 0x05, 0x3b,
1880
136M
      0x07, 0x02, 0x0e, 0x18, 0x09, 0x80, 0xb3, 0x2d, 0x74, 0x0c, 0x80, 0xd6,
1881
136M
      0x1a, 0x0c, 0x05, 0x80, 0xff, 0x05, 0x80, 0xdf, 0x0c, 0xee, 0x0d, 0x03,
1882
136M
      0x84, 0x8d, 0x03, 0x37, 0x09, 0x81, 0x5c, 0x14, 0x80, 0xb8, 0x08, 0x80,
1883
136M
      0xcb, 0x2a, 0x38, 0x03, 0x0a, 0x06, 0x38, 0x08, 0x46, 0x08, 0x0c, 0x06,
1884
136M
      0x74, 0x0b, 0x1e, 0x03, 0x5a, 0x04, 0x59, 0x09, 0x80, 0x83, 0x18, 0x1c,
1885
136M
      0x0a, 0x16, 0x09, 0x4c, 0x04, 0x80, 0x8a, 0x06, 0xab, 0xa4, 0x0c, 0x17,
1886
136M
      0x04, 0x31, 0xa1, 0x04, 0x81, 0xda, 0x26, 0x07, 0x0c, 0x05, 0x05, 0x80,
1887
136M
      0xa5, 0x11, 0x81, 0x6d, 0x10, 0x78, 0x28, 0x2a, 0x06, 0x4c, 0x04, 0x80,
1888
136M
      0x8d, 0x04, 0x80, 0xbe, 0x03, 0x1b, 0x03, 0x0f, 0x0d,
1889
136M
  };
1890
136M
  static constexpr unsigned char normal1[] = {
1891
136M
      0x5e, 0x22, 0x7b, 0x05, 0x03, 0x04, 0x2d, 0x03, 0x66, 0x03, 0x01, 0x2f,
1892
136M
      0x2e, 0x80, 0x82, 0x1d, 0x03, 0x31, 0x0f, 0x1c, 0x04, 0x24, 0x09, 0x1e,
1893
136M
      0x05, 0x2b, 0x05, 0x44, 0x04, 0x0e, 0x2a, 0x80, 0xaa, 0x06, 0x24, 0x04,
1894
136M
      0x24, 0x04, 0x28, 0x08, 0x34, 0x0b, 0x01, 0x80, 0x90, 0x81, 0x37, 0x09,
1895
136M
      0x16, 0x0a, 0x08, 0x80, 0x98, 0x39, 0x03, 0x63, 0x08, 0x09, 0x30, 0x16,
1896
136M
      0x05, 0x21, 0x03, 0x1b, 0x05, 0x01, 0x40, 0x38, 0x04, 0x4b, 0x05, 0x2f,
1897
136M
      0x04, 0x0a, 0x07, 0x09, 0x07, 0x40, 0x20, 0x27, 0x04, 0x0c, 0x09, 0x36,
1898
136M
      0x03, 0x3a, 0x05, 0x1a, 0x07, 0x04, 0x0c, 0x07, 0x50, 0x49, 0x37, 0x33,
1899
136M
      0x0d, 0x33, 0x07, 0x2e, 0x08, 0x0a, 0x81, 0x26, 0x52, 0x4e, 0x28, 0x08,
1900
136M
      0x2a, 0x56, 0x1c, 0x14, 0x17, 0x09, 0x4e, 0x04, 0x1e, 0x0f, 0x43, 0x0e,
1901
136M
      0x19, 0x07, 0x0a, 0x06, 0x48, 0x08, 0x27, 0x09, 0x75, 0x0b, 0x3f, 0x41,
1902
136M
      0x2a, 0x06, 0x3b, 0x05, 0x0a, 0x06, 0x51, 0x06, 0x01, 0x05, 0x10, 0x03,
1903
136M
      0x05, 0x80, 0x8b, 0x62, 0x1e, 0x48, 0x08, 0x0a, 0x80, 0xa6, 0x5e, 0x22,
1904
136M
      0x45, 0x0b, 0x0a, 0x06, 0x0d, 0x13, 0x39, 0x07, 0x0a, 0x36, 0x2c, 0x04,
1905
136M
      0x10, 0x80, 0xc0, 0x3c, 0x64, 0x53, 0x0c, 0x48, 0x09, 0x0a, 0x46, 0x45,
1906
136M
      0x1b, 0x48, 0x08, 0x53, 0x1d, 0x39, 0x81, 0x07, 0x46, 0x0a, 0x1d, 0x03,
1907
136M
      0x47, 0x49, 0x37, 0x03, 0x0e, 0x08, 0x0a, 0x06, 0x39, 0x07, 0x0a, 0x81,
1908
136M
      0x36, 0x19, 0x80, 0xb7, 0x01, 0x0f, 0x32, 0x0d, 0x83, 0x9b, 0x66, 0x75,
1909
136M
      0x0b, 0x80, 0xc4, 0x8a, 0xbc, 0x84, 0x2f, 0x8f, 0xd1, 0x82, 0x47, 0xa1,
1910
136M
      0xb9, 0x82, 0x39, 0x07, 0x2a, 0x04, 0x02, 0x60, 0x26, 0x0a, 0x46, 0x0a,
1911
136M
      0x28, 0x05, 0x13, 0x82, 0xb0, 0x5b, 0x65, 0x4b, 0x04, 0x39, 0x07, 0x11,
1912
136M
      0x40, 0x05, 0x0b, 0x02, 0x0e, 0x97, 0xf8, 0x08, 0x84, 0xd6, 0x2a, 0x09,
1913
136M
      0xa2, 0xf7, 0x81, 0x1f, 0x31, 0x03, 0x11, 0x04, 0x08, 0x81, 0x8c, 0x89,
1914
136M
      0x04, 0x6b, 0x05, 0x0d, 0x03, 0x09, 0x07, 0x10, 0x93, 0x60, 0x80, 0xf6,
1915
136M
      0x0a, 0x73, 0x08, 0x6e, 0x17, 0x46, 0x80, 0x9a, 0x14, 0x0c, 0x57, 0x09,
1916
136M
      0x19, 0x80, 0x87, 0x81, 0x47, 0x03, 0x85, 0x42, 0x0f, 0x15, 0x85, 0x50,
1917
136M
      0x2b, 0x80, 0xd5, 0x2d, 0x03, 0x1a, 0x04, 0x02, 0x81, 0x70, 0x3a, 0x05,
1918
136M
      0x01, 0x85, 0x00, 0x80, 0xd7, 0x29, 0x4c, 0x04, 0x0a, 0x04, 0x02, 0x83,
1919
136M
      0x11, 0x44, 0x4c, 0x3d, 0x80, 0xc2, 0x3c, 0x06, 0x01, 0x04, 0x55, 0x05,
1920
136M
      0x1b, 0x34, 0x02, 0x81, 0x0e, 0x2c, 0x04, 0x64, 0x0c, 0x56, 0x0a, 0x80,
1921
136M
      0xae, 0x38, 0x1d, 0x0d, 0x2c, 0x04, 0x09, 0x07, 0x02, 0x0e, 0x06, 0x80,
1922
136M
      0x9a, 0x83, 0xd8, 0x08, 0x0d, 0x03, 0x0d, 0x03, 0x74, 0x0c, 0x59, 0x07,
1923
136M
      0x0c, 0x14, 0x0c, 0x04, 0x38, 0x08, 0x0a, 0x06, 0x28, 0x08, 0x22, 0x4e,
1924
136M
      0x81, 0x54, 0x0c, 0x15, 0x03, 0x03, 0x05, 0x07, 0x09, 0x19, 0x07, 0x07,
1925
136M
      0x09, 0x03, 0x0d, 0x07, 0x29, 0x80, 0xcb, 0x25, 0x0a, 0x84, 0x06,
1926
136M
  };
1927
136M
  auto lower = static_cast<uint16_t>(cp);
1928
136M
  if (cp < 0x10000) {
1929
91.1M
    return is_printable(lower, singletons0,
1930
91.1M
                        sizeof(singletons0) / sizeof(*singletons0),
1931
91.1M
                        singletons0_lower, normal0, sizeof(normal0));
1932
91.1M
  }
1933
44.8M
  if (cp < 0x20000) {
1934
245k
    return is_printable(lower, singletons1,
1935
245k
                        sizeof(singletons1) / sizeof(*singletons1),
1936
245k
                        singletons1_lower, normal1, sizeof(normal1));
1937
245k
  }
1938
44.5M
  if (0x2a6de <= cp && cp < 0x2a700) return false;
1939
44.5M
  if (0x2b735 <= cp && cp < 0x2b740) return false;
1940
44.5M
  if (0x2b81e <= cp && cp < 0x2b820) return false;
1941
44.5M
  if (0x2cea2 <= cp && cp < 0x2ceb0) return false;
1942
44.5M
  if (0x2ebe1 <= cp && cp < 0x2f800) return false;
1943
44.5M
  if (0x2fa1e <= cp && cp < 0x30000) return false;
1944
44.5M
  if (0x3134b <= cp && cp < 0xe0100) return false;
1945
44.5M
  if (0xe01f0 <= cp && cp < 0x110000) return false;
1946
44.5M
  return cp < 0x110000;
1947
44.5M
}
1948
1949
}  // namespace detail
1950
1951
FMT_END_NAMESPACE
1952
1953
#endif  // FMT_FORMAT_INL_H_